Fortran 2003绑定到C中的库:如何翻译枚举和#defines?

Jak*_*ski 5 c fortran fortran90

我正在为C库编写Fortran绑定.

使用枚举翻译定义的常量(在库头中)的最佳实践是什么,例如

typedef enum cufftType_t {
  CUFFT_R2C = 0x2a,     // Real to Complex (interleaved)
  CUFFT_C2R = 0x2c,     // Complex (interleaved) to Real
  CUFFT_C2C = 0x29,     // Complex to Complex, interleaved
  CUFFT_D2Z = 0x6a,     // Double to Double-Complex
  CUFFT_Z2D = 0x6c,     // Double-Complex to Double
  CUFFT_Z2Z = 0x69      // Double-Complex to Double-Complex
} cufftType;
Run Code Online (Sandbox Code Playgroud)

以及如何使用翻译常数#define,例如

#define CUFFT_FORWARD -1 // Forward FFT
#define CUFFT_INVERSE  1 // Inverse FFT
Run Code Online (Sandbox Code Playgroud)

或这些的组合

typedef enum cufftCompatibility_t {
    CUFFT_COMPATIBILITY_NATIVE          = 0x00, 
    CUFFT_COMPATIBILITY_FFTW_PADDING    = 0x01,    // The default value
    CUFFT_COMPATIBILITY_FFTW_ASYMMETRIC = 0x02,
    CUFFT_COMPATIBILITY_FFTW_ALL        = 0x03
} cufftCompatibility;

#define CUFFT_COMPATIBILITY_DEFAULT   CUFFT_COMPATIBILITY_FFTW_PADDING
Run Code Online (Sandbox Code Playgroud)

这些信息应该在单独的文件中,INCLUDE-d还是仅在USE-d模块中?

har*_*dkl 4

枚举实际上受 ISO_C_Binding 支持,例如,请参阅此文档:http://docs.cray.com/books/S-3693-36/html-S-3693-36/z1018297010.html 至于定义的文字常量在预处理中:您可以在 Fortran 文件上运行 C 预处理器。或者您使用一个额外的模块,在其中定义所有这些常量(并仅在该文件上运行 C 预处理器)。无论如何,我会使用要使用的模块,而不是包含的模块。尽管这有一个缺点,即您依赖于由编译器生成且特定于编译器的模块文件,但在使用 include 时可以避免这种情况,但会不太“像 Fortran”。