所以,通过n869的C99标准草案,我偶然发现了这一部分:
6.10.7空指令语义
表单
的预处理指令# new-line
没有效果。
所以,我写了这个程序来测试它:
#
#include <stdio.h>
#
int main(void)
{
puts("Hello, world!");
return 0;
}
果然,gcc
对此代码没有任何兴趣,即使我一直发出警告等等。我意识到语言中有一些其他结构并不明显,比如初始化器,枚举定义等允许的额外逗号,但这有一个目的(例如简化编写代码生成器)。
但是,我不知道这个是如何有用的。有人能想到合理的使用案例/理由吗?
答案 0 :(得分:2)
来自GNU doc:
..... null指令存在的主要意义是 输入行只包含
#' will produce no output, rather than a line of output containing just a
#'。据说有些 旧的C程序包含这样的行。
答案 1 :(得分:1)
从GCC文档,第1.7节:
null指令由
#' followed by a Newline, with only whitespace (including comments) in between. A null directive is understood as a preprocessing directive but has no effect on the preprocessor output. The primary significance of the existence of the null directive is that an input line consisting of just a
#'组成,不产生输出,而不是只包含`#'的输出行。据说一些旧的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*/