7

因此,在翻阅 C99 标准的 n869 草案时,我偶然发现了这一节:

6.10.7 空指令语义

形式的预处理指令

# new-line

没有效果。

所以,我写了这个程序来测试它:

#
#include <stdio.h>
#

int main(void)
{
  puts("Hello, world!");

  return 0;
}

果然gcc,即使我一路发出警告等等,我也对这段代码没有任何不满。我意识到该语言中还有一些其他不明显的结构,例如初始化程序中允许的额外逗号、枚举定义等,但这是有目的的(例如,简化了代码生成器的编写)。

但是,我看不出这个有什么用。任何人都可以想到一个合理的用例/理由吗?

4

2 回答 2

3

来自GNU文档:

.....null 指令存在的主要意义在于输入行只包含一个#' will produce no output, rather than a line of output containing just a#'。据说一些旧的 C 程序包含这样的行。

于 2012-04-05T00:01:09.657 回答
3

来自 GCC 文档,第 1.7 节:

由#' 组成的n​​ull 指令#' 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*/   
于 2012-04-05T00:08:33.253 回答