预处理器是否扩展用引号括起来的宏?

Nun*_*uno 1 c unix preprocessor fortran

像 cpp 和 fpp 这样的常见预处理器是否会扩展由一对引号括起来的宏?

我同时使用 cpp 和 fpp 尝试了以下代码,似乎引号内的宏没有展开。但是,我在有关 cpp 或 fpp 的任何文档中都没有找到此规则。任何人都可以指导我查看一些文档,以便我可以确定这种行为吗?谢谢。

#define X Y
X
"X"
'X'
Run Code Online (Sandbox Code Playgroud)

Joh*_*ger 5

像 cpp 和 fpp 这样的常见预处理器是否会扩展由一对引号括起来的宏?

C 语言规范描述了符合 C 预处理器的行为。C 的实际标准不是免费提供的,但您可以获得最新草案的副本。例如,对于 C18,您可以参考N2176。特别是,您应该查看 5.1.1.2 和 6.10.3 节。特别相关的是第 6.10.3 节中的脚注 173:

由于在宏替换时,所有字符常量和字符串文字都是预处理标记,而不是可能包含类似标识符的子序列的序列(参见 5.1.1.2,翻译阶段),因此永远不会扫描它们的宏名称或参数。

(基本上相同的文本也出现在标准的早期版本中。)

那么,C 的底线是,符合 C 的预处理器不会对字符串文字或字符常量的内容执行宏替换。


Fortran 的情况不太清楚,因为 Fortran 语言规范没有定义预处理设施。include语言本身内置了一条语句,但 Fortran 从业者通常不会考虑使用它来涉及预处理。Fortran 源代码很少依赖预处理功能,例如宏扩展或条件编译。

尽管如此,一些 Fortran 实现确实提供了预处理工具,有时可以作为名为fpp. 您需要查阅特定文档以fpp获取详细信息,但通常这些是 C 预处理器对 Fortran 语法的改编。因此,,我不希望 Fortran 预处理器对字符文字的内容执行宏扩展。我不知道有任何违背我在这方面期望的实现。