gpt4 book ai didi

检查 iso_c_binding 在编译时是否可用

转载 作者:太空狗 更新时间:2023-10-29 15:07:28 29 4
gpt4 key购买 nike

在混合 C/Fortran 应用程序的上下文中,有没有一种方法可以检查编译器是否知道“iso_c_binding”(例如 GCC 4.1.2 不知道,而 4.3.4 知道),就像预编译器一样-处理指令之类的?我不能简单地检查 GCC 的版本,因为我可能会使用其他编译器。

谢谢

最佳答案

我能想到的仅有的两个选择是推出您自己的 iso_c_binding 版本对于没有此模块的系统 ( as suggested by @HighPerformanceMark ) 或使用预处理器根据编译器版本有条件地编译部分代码。在这两种情况下,您都必须努力确保您的代码可以跨系统移植。正如@HighPerformanceMark 所建议的,您可以复制并粘贴 iso_c_binding 的开源实现。 ,但是对于您将代码移植到的每个新系统,您都必须检查此实现是否正确。

如果 iso_c_binding 取决于您希望代码的行为方式is not avaiable 我建议使用预处理器方法。您声明“我不能简单地检查 GCC 的版本,因为我可能会使用其他编译器”。但是,您的所有选项都需要您自己来维护您的代码以便在不同的系统上使用,在我看来,预处理器方法需要的工作量最少。

以下代码使用预处理器确定编译器版本,可用于根据编译器版本是否满足某个最低版本来有条件地编译您的代码。对于 gfortran :

If GNU Fortran invokes the preprocessor, __GFORTRAN__ is defined and __GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__ can be used to determine the version of the compiler.

在一个文件中,说 precomp.inc我会包括一些预编译器检查,这些检查确定要在您的代码中包含哪些功能。例如,我会检查编译器版本,如果它支持使用 iso_c_binding模块我会定义一个预处理器宏 HAS_ISO_C_BINDING (或类似)。文件precomp.inc然后可以包含在代码的其他部分中。该文件可能类似于:

!> \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 模块的情况下进行编译。

您的 Fortran 源代码看起来像

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 在编译时是否可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955378/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com