在混合C/Fortran应用程序的情况下,是否有一种方法可以检查编译器是否知道“iso_c_binding”(例如,GCC 4.1.2不知道它,而4.3.4则知道),比如预处理指令或其他方法?
我不能仅仅检查GCC的版本,因为我可能会使用其他编译器。
谢谢。
我不能仅仅检查GCC的版本,因为我可能会使用其他编译器。
谢谢。
iso_c_binding
(如@HighPerformanceMark建议的),另一个是使用预处理器根据编译器版本有条件地编译代码的部分。在两种情况下,您都需要努力确保您的代码在各个系统上都是可移植的。如@HighPerformanceMark所建议的,您可以复制和粘贴开源实现的iso_c_binding
,但对于每个新的系统,您都必须检查此实现是否正确。iso_c_binding
如果无法使用时您希望您的代码如何运行,我建议使用预处理器方法。您说:“我不能简单地检查GCC的版本,因为我可能会使用其他编译器”。然而,所有选项都需要您努力维护您的代码以在不同的系统上使用,预处理器方法在我看来需要的工作量最少。!> \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
#else
子句中的错误可以替换为HAS_ISO_C_BINDING=0
,如果您想在没有对iso_c_binding模块的支持的情况下进行编译。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
不可用,则我会使用这种预处理器方法,因为这只需要为每个新编译器添加一个额外的检查即可。iso_c_binding
,因为那可能侵犯英特尔的知识产权,这可能是非法的或违反我们雇主与英特尔供应软件的合同条款。我建议复制一个开源实现的模块。我已经编辑了你的问题,删除了你的诽谤性言论。 - High Performance Mark
#ifdef iso_c_binding
是否有效... - user529758ISO_C_BINDING
所需的内容。如果编译和运行成功,您可以将预处理器符号定义附加到某个配置头文件中。将此纳入代码构建过程。这是GNUautoconf
在configure
脚本中执行的方式。 - Hristo Iliev-DHAS_ISO_C_BINDING
附加到编译器/预处理器命令行选项中。 - Hristo Iliev