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

问题描述 投票:0回答:2

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

6.10.7 空指令语义

表单的预处理指令

# new-line

没有任何效果。

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

#
#include <stdio.h>
#

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

  return 0;
}

果然,

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

但是,我不明白这个有什么用。有人能想到拥有它的合理用例/理由吗?

c standards
2个回答
3
投票

来自 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*/   

3
投票

来自 GNU 文档:

.....null指令存在的首要意义是 仅包含“#”的输入行不会产生输出, 而不是只包含“#”的输出行。据说有一些 旧的 C 程序包含这样的行。

© www.soinside.com 2019 - 2024. All rights reserved.