c-预处理指令前的空宏的标准行为



例如:

#define FOO
FOO #define BAR 1
BAR

根据ANSI C和C99标准,上述代码的预处理输出应该是什么?

在我看来,这应该被评估为1;然而,通过gcc -Eclang -E运行上述示例会产生以下结果:

#define BAR 1
BAR

标准草案"ISO/IEC 9899:201x委员会草案——2011年4月12日N1570";第6.10节实际上包含了一个例子:

示例:

#define EMPTY 
EMPTY # include <file.h>

第二行上的预处理标记序列不是预处理指令,因为它在转换阶段4开始时不以#开头,即使它将在宏EMPTY被替换之后这样做。

它告诉我们";。。。第二行是而不是预处理指令">

所以对于你的代码

FOO #define BAR 1

不是预处理指令,意味着只有FOO将被替换,BAR将不被定义。因此,预处理器的输出为:

#define BAR 1
BAR

您的代码不是有效的

ISO/IEC 9899:2011,第6.10节预处理指令:

预处理指令由一系列预处理组成满足以下约束的令牌:中的第一个令牌序列是一个#预处理令牌,它(在翻译阶段4(是源文件中的第一个字符(可选地在不包含换行符的空白之后(或其跟随包含至少一个新行字符的空白。

此示例实际出现在标准(C17 6.10/8(中:

示例:

#define EMPTY
EMPTY # include <file.h>

第二行上的预处理令牌序列不是预处理指令,因为它在转换阶段4开始时不以#开始,即使它将在宏EMPTY被替换之后这样做。

所以您从gcc -E看到的输出是正确的。(注意:这里的空白量并不重要,在翻译阶段,程序已被翻译成一系列预处理标记;输出中不同数量的空白只是gcc -E工作方式的假象(。

最新更新