Привязки Fortran 2003 к библиотеке в C: как перевести перечисления и #defines? - PullRequest
5 голосов
/ 03 декабря 2011

Я пишу привязки на Фортране для библиотеки C.

Что такое рекомендация при переводе констант, определенных (в заголовках библиотеки) с использованием enum , например

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;

и что при переводе констант с использованием #define, например

#define CUFFT_FORWARD -1 // Forward FFT
#define CUFFT_INVERSE  1 // Inverse FFT

или их комбинаций

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

Должна ли эта информация быть вотдельный файл, INCLUDE-d или просто в модуле USE-d?

1 Ответ

4 голосов
/ 03 декабря 2011

Перечисления фактически поддерживаются привязкой ISO_C_Binding, см., Например, эту документацию: http://docs.cray.com/books/S-3693-36/html-S-3693-36/z1018297010.html Что касается литеральных констант, определенных в предварительной обработке: вы можете запустить C-препроцессор на ваших файлах Fortran. Или вы используете дополнительный модуль, в котором вы определяете все эти константы (и запускаете препроцессор C только для этого одного файла). В любом случае я бы использовал модули, которые будут использоваться, а не включает. Хотя у этого есть недостаток, вы зависите от файлов модулей, которые генерируются компилятором и зависят от компилятора, этого можно было бы избежать при использовании include, но он будет менее «похож на Fortran».

...