因此,在翻阅 C99 标准的 n869 草案时,我偶然发现了这一部分:
6.10.7 空指令语义
表单的预处理指令
# new-line
没有任何效果。
所以,我写了这个程序来测试一下:
#
#include <stdio.h>
#
int main(void)
{
puts("Hello, world!");
return 0;
}
果然,
gcc
对这段代码没有任何不满,即使我一路发出警告之类的声音。我意识到该语言中还有一些不明显的其他构造,例如初始化程序、枚举定义等中允许的额外逗号,但这是有目的的(例如简化代码生成器的编写)。
但是,我不明白这个有什么用。有人能想到拥有它的合理用例/理由吗?
来自 GCC 文档,第 1.7 节:
null 指令由一个“#”和一个换行符组成,中间只有空格(包括注释)。 null 指令被理解为预处理指令,但对预处理器输出没有影响。 null 指令存在的主要意义是仅包含“#”的输入行不会产生输出,而不是仅包含“#”的输出行。据说一些旧的 C 程序包含这样的行。
请记住,C 预处理器本身就是一个程序,它有输入和输出。 C 预处理器的输出通常包括程序注释,但是如果注释出现在以“#”符号开头的行上,并且除了空格和注释之外没有任何内容,则注释将不会出现在预处理器输出中。因此,null 指令会导致内容出现在源代码中,但不会出现在预处理器输出中。
示例:
预处理器将进行转换
#include <stdio.h>
#define HELLO 1
# /*This comment is for preprocessor only*/
HELLO
/*This comment is for preprocessed code*/
进入
(... preprocessed contents of stdio.h ...)
1
/*This comment is for preprocessed code*/
来自 GNU 文档:
.....null指令存在的首要意义是 仅包含“#”的输入行不会产生输出, 而不是只包含“#”的输出行。据说有一些 旧的 C 程序包含这样的行。