因此,在浏览 C99 标准的 n869 草案时,我偶然发现了这一部分:
6.10.7 空指令语义
形式的预处理指令
Run Code Online (Sandbox Code Playgroud)# new-line
没有效果。
所以,我写了这个程序来测试它:
#
#include <stdio.h>
#
int main(void)
{
puts("Hello, world!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
果然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*/
Run Code Online (Sandbox Code Playgroud)
进入
(... preprocessed contents of stdio.h ...)
1
/*This comment is for preprocessed code*/
Run Code Online (Sandbox Code Playgroud)