言語が混在したプログラミングにおけるモジュールの使用

インテル® Fortran モジュールは C/C++ から直接、アクセスすることができます。そのため、C 言語との間で多くの変数を交換するには、モジュール化が最も簡単な方法です。次の例では、Fortran でモジュールが宣言されており、C からデータにアクセスできます。

Fortran コード:

 ! F90 Module definition
    MODULE EXAMP
       REAL A(3)
       INTEGER I1, I2
       CHARACTER(80) LINE
       TYPE MYDATA
          SEQUENCE
          INTEGER N
          CHARACTER(30) INFO
       END TYPE MYDATA
    END MODULE EXAMP

C のコード:

  \* C code accessing module data *\
  extern float EXAMP_mp_A[3];
  extern int EXAMP_mp_I1, EXAMP_mp_I2;
  extern char EXAMP_mp_LINE[80];
  extern struct {
            int N;
            char INFO[30];
  } EXAMP_mp_MYDATA;

C++ のコードが .cpp ファイルに存在する場合、C++ 言語のセマンティクスが外部名に適用されるため、リンカーエラーが頻繁に発生します。この場合は、extern "C" 構文 (詳細は、「C/C++ 命名規則」を参照してください) を使用します。

  \* C code accessing module data in .cpp file*\
  extern "C" float EXAMP_mp_A[3];
  extern "C" int EXAMP_mp_I1, EXAMP_mp_I2;
  extern "C" char EXAMP_mp_LINE[80];
  extern "C" struct {
            int N;
            char INFO[30];
  } EXAMP_mp_MYDATA;

インターフェイスをモジュール内の C ルーチンに定義して、Fortran ルーチンのインターフェイスのように使用します。C のコードは次のとおりです。

C のコード:

   // C procedure
  void pythagoras (float a, float b, float *c)
  {
     *c = (float) sqrt(a*a + b*b);
  }

C++ のコードが .cpp ファイルに存在する場合は、extern "C" 構文を使用します (詳細は、「C/C++ 命名規則」を参照してください)。

  // C procedure
  void pythagoras (float a, float b, float *c)
  {
     *c = (float) sqrt(a*a + b*b);
  }

CPROC モジュールを定義する Fortran コード:

   ! Fortran 95/90 Module including procedure
     MODULE CPROC
        INTERFACE
           SUBROUTINE PYTHAGORAS (a, b, res)
            !DEC$ ATTRIBUTES C :: PYTHAGORAS
            !DEC$ ATTRIBUTES REFERENCE :: res
  ! res is passed by REFERENCE because its individual attribute
  ! overrides the subroutine's C attribute
              REAL a, b, res
  ! a and b have the VALUE attribute by default because
  ! the subroutine has the C attribute
           END SUBROUTINE
        END INTERFACE
     END MODULE

CPROC モジュールを使用してこのルーチンを呼び出す Fortran コード:

   ! Fortran 95/90 Module including procedure
     USE CPROC
        CALL PYTHAGORAS (3.0, 4.0, X)
        TYPE *,X
     END