C预处理器的Null指令有什么意义?

时间:2012-04-04 23:57:26

标签: c standards

所以,通过n869的C99标准草案,我偶然发现了这一部分:

  

6.10.7空指令语义

     

表单

的预处理指令
# new-line
     

没有效果。

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

#
#include <stdio.h>
#

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

  return 0;
}

果然,gcc对此代码没有任何兴趣,即使我一直发出警告等等。我意识到语言中有一些其他结构并不明显,比如初始化器,枚举定义等允许的额外逗号,但这有一个目的(例如简化编写代码生成器)。

但是,我不知道这个是如何有用的。有人能想到合理的使用案例/理由吗?

2 个答案:

答案 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*/