【发布时间】:2014-11-13 02:13:39
【问题描述】:
我最近碰巧遇到了当今大多数 Fortran 编译器支持的预处理选项(如 Fortran Wiki 中所述)。来自 C 背景,我想更好地了解与 (Fortran-) 预处理器的 #include 指令相关的机制和注意事项。
从一开始就避免任何混淆:Fortran 中有两个 include 指令(参见例如 F77 reference)
-
include "foo"是编译器指令,即 foo 只能包含 Fortran 语句 -
#include "bar"是一个预处理指令,即 bar 可以包含#defines等
我知道这种差异,我只对第二种情况感兴趣(因此我的问题不是this post 的重复)。
我将用一个例子来解释我的问题:假设我们有两个文件,一个头文件 (macro.h) 和一个源文件 (display.F):
宏.h
#define MSG() say_hello()
display.F
#include "macro.h"
PROGRAM display
CALL MSG()
CALL another_message()
END
SUBROUTINE say_hello()
WRITE(*,*) 'Hello.'
END
SUBROUTINE another_message()
CALL MSG()
END
这是我的问题:
范围
如果我包含 macro.h,则定义宏 MSG() 的位置(全局、本地 SUBROUTINE 等)是:
- 在文件的开头(如上)?
- 在
PROGRAM display的开头(没有其他地方)? - 在例如开头
SUBROUTINE another_message()(别无他处)?
从测试看来:1. 全局,2. 在PROGRAM 和所有SUBROUTINES,3. 在那个SUBROUTINE 中。对这些假设的确认和一些理论上的解释为什么会很棒。
上述 (1. - 3.) 中哪些是预处理器的最佳实践包括?
包括警卫
如果我有一个多文件项目并且我在多个 *.F 源文件中包含 header.h,我是否需要提供包含保护?
如果上述问题的答案取决于编译器(因为预处理不是 Fortran 标准),我最感兴趣的是 ifort 的行为。
【问题讨论】:
标签: scope fortran preprocessor include-guards