5

混合 C/Fortran アプリケーションのコンテキスト内で、前処理ディレクティブのように、コンパイラが「iso_c_binding」を認識していることを確認する方法はありますか (たとえば、GCC 4.1.2 は認識していませんが、4.3.4 は認識しています)。か何か?他のコンパイラを使用する可能性があるため、GCC のバージョンを単純に確認する余裕はありません。

ありがとう

4

2 に答える 2

2

私が考えることができる唯一の2つのオプションは、iso_c_bindingこのモジュールを持たないシステム用に独自のバージョンをロールするか(@HighPerformanceMarkで提案されているように)、コンパイラのバージョンに応じてプリプロセッサを使用してコードの一部を条件付きでコンパイルすることです。どちらの場合も、コードがシステム間で移植可能であることを確認するために作業する必要があります。@HighPerformanceMarkによって提案されているように、のオープンソース実装をコピーして貼り付けることができますがiso_c_binding、新しいシステムごとにコードを移植する場合は、この実装が正しいことを確認する必要があります。

利用できないiso_c_binding場合にコードをどのように動作させるかに応じて、プリプロセッサ方式を使用することをお勧めします。「他のコンパイラを使用している可能性があるため、GCCのバージョンを単純にチェックする余裕はありません」とあなたは述べています。ただし、すべてのオプションでは、さまざまなシステムで使用するためにコードを維持するために、ユーザー側での作業が必要になります。プリプロセッサ方式では、私の意見では、最小限の作業で済みます。

次のコードは、プリプロセッサを使用してコンパイラのバージョンを決定し、コンパイラのバージョンが最小バージョンを満たしているかどうかに基づいて、条件付きでコードをコンパイルするために使用できます。gfortranの場合:

GNU Fortranがプリプロセッサを呼び出す場合、__GFORTRAN__はで定義され__GNUC__、コンパイラのバージョンを決定するため__GNUC_MINOR____GNUC_PATCHLEVEL__使用できます。

ファイルに、precomp.incコードに含める機能を決定するプリコンパイラチェックをいくつか含めるとしましょう。たとえば、コンパイラのバージョンを確認し、それがiso_c_bindingモジュールの使用をサポートしている場合は、プリプロセッサマクロHAS_ISO_C_BINDING(または同様のもの)を定義します。その後、ファイルprecomp.incをコードの他の部分に含めることができます。このファイルは次のようになります。

!> \file precomp.inc
!! Preprocessor feature detection.

#if defined(__GFORTRAN__)

#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3
#define HAS_ISO_C_BINDING 1
#else
#define HAS_ISO_C_BINDING 0
#endif

#elif defined(__INTEL_COMPILER)
#error "I haven't implemented this yet..."

#else
#error "Compiler not yet supported."

#endif

iso_c_bindingモジュールをサポートせずにコンパイルできるようにする場合は、final#else句のエラーをに置き換えることができます。HAS_ISO_C_BINDING=0

あなたのFortranソースは次のようになります

program main

#include 'precomp.h'
#if HAS_ISO_C_BINDING
use iso_c_binding
#endif

implicit none

! Some code...

#if HAS_ISO_C_BINDING
! Code which depends on iso_c_binding
#else
! Fallback code
#end if

! Some more code...

end program main

繰り返しになりますが、使用する正しい方法は、使用できiso_c_bindingない場合にコンパイルするコードをどのように設定するかによって異なります。このモジュールのないシステムでコードをコンパイルする必要がある場合は、@HighPerformanceMarkの答えの方がおそらく良いでしょう。コンパイル時にエラーが発生する可能性がある場合、またはiso_c_binding使用できない場合にフォールバックコードがある場合は、このプリプロセッサメソッドを使用します。これは、使用する必要のある新しいコンパイラごとに1つの追加チェックを追加するだけでよいためです。

于 2012-08-15T09:24:27.280 に答える
0

質問の方向が間違っています。実際にあなたが求めているのは、コンパニオン Fortran プロセッサ (存在すると仮定) が、C プログラムが必要とする C 相互運用性の必要な側面をサポートしているかどうかです。C の相互運用性には、組み込みモジュールが存在するだけではありません。

たとえば、F2003 プロセッサが ISO_C_BINDING を提供して、C 相互運用性のほぼすべての側面がサポートされていないことを示すのは、まったく正当なことです (C_FLOAT、C_REAL などの定数は、「サポートされていない」ことを意味する負の値を持つ可能性があります)。

したがって、C の相互運用性の使用が非常に基本的なものでない限り (C_INT、C_LOC、C_F_POINTER など、F2003 プロセッサでサポートする必要がある側面がいくつかあります)、機能を確認するための唯一の実用的な方法は次のとおりです。

  • 必要なエンティティーを明示的に USE し、それらの値をテストする小さな Fortran プログラムをコンパイルするには (Fortran プロセッサーがサポートを提供しない理由は、異なる負の数によって説明されます)。他の人が書いているように、コンパイルの成功または失敗、およびコンパイルが成功した場合はおそらく後続のプログラム出力を使用して、ビルドの他の側面を構成できます。

  • Fortran プロセッサのマニュアルを読むには。

于 2012-08-15T23:17:44.650 に答える