我正在寻找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....
部分。
感谢对此的任何想法。
答案 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