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