Fortran CPP类预处理器的替代品

时间:2017-05-18 13:14:37

标签: fortran c-preprocessor fortran90 preprocessor

我正在寻找Fortran 90代码中#ifdef #else #enddef的替代方案。 还有另一种方法来控制调用模块时执行use语句的内容吗?我希望摆脱复杂系统中的#include文件。

例如,这就是我现在所拥有的。

#include "defs.h"
module X
#ifdef Sys
use ....
#else
use ....
#endif
implicit none

snip...
#ifdef Sys
some block of code...
#else
some block of code...
#endif
end module X

在defs.h中定义了Sys。我想找到一个替代方法来使用defs.h来控制代码的#ifdef....部分。

感谢对此的任何想法。

1 个答案:

答案 0 :(得分:2)

我将首先重复评论中提到的内容:正确解决您真正问题的方法是找出为什么在使用FCM时编译器无法找到您希望包含的文件。

要修复您的特定问题,由于无法成功include提供各种定义的给定文件,我们可以通过传递给编译器的参数来定义符号。

考虑以下内容,存储在test.fpp

#ifdef Sys
#warning "This messages tells you Sys is defined"
#else
#warning "This messages tells you Sys is NOT defined"
#endif

program test
  implicit none
  write(*,'("For clarity we will now print defined if Sys is defined or not defined if Sys is not defined")')
#ifdef Sys
  write(*,'("Defined")')
#else
  write(*,'("Not defined")')
#endif
end program test

我们可以使用gfortran -ffree-form test.fpp -o test编译它。这将产生:

test.fpp:4:2: warning: #warning "This messages tells you Sys is NOT defined" [-Wcpp]
 #warning "This messages tells you Sys is NOT defined"
  ^

并且./test执行输出

For clarity we will now print defined if Sys is defined or not defined if Sys is not defined
Not defined

如果我们现在使用gfortran -ffree-form test.fpp -o test -DSys进行编译,我们会看到消息

test.fpp:2:2: warning: #warning "This messages tells you Sys is defined" [-Wcpp]
 #warning "This messages tells you Sys is defined"
  ^

并且正在运行./test给我们

For clarity we will now print defined if Sys is defined or not defined if Sys is not defined
Defined