C语言:运算符"#"的含义?

Ant*_*per 14 c

这段代码可以编译gcc -g -o main main.c,没有警告.

// main.c
# 41 "stdio.h"
# 22
#
int main(void){
    (void)printf("foo");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. "include"之前运算符"#"的含义是什么.我们#include <stdio.h>用来包含头文件,为什么不include <stdio.h>呢?

  2. 为什么# 22# 41可以编译,我以前从未见过它.

有人可以帮帮我吗?

Fer*_*eak 8

这看起来像预处理器的输出.这条线

# 41 "stdio.h"
Run Code Online (Sandbox Code Playgroud)

可以解释为:

  • 41的含义是:

它指定应为下一行输入报告的行号.后续行从亚麻布计算.

  • "stdio.h" 只是从中获取行的文件名.

报告以下行和所有后续行来自它指定的文件,直到发生其他更改.filename根据字符串常量的常规规则进行解释:解释反斜杠转义.

所有这些信息都来自https://gcc.gnu.org/onlinedocs/cpp/Line-Control.html#Line-Controlhttps://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html #预处理程序输出

对于单身#:

null指令由一个'#'后跟一个换行符组成,中间只有空格(包括注释).null指令被理解为预处理指令,但对预处理器输出没有影响.存在空指令的主要意义在于,仅由'#'组成的输入行将不产生输出,而不是仅包含'#'的输出行.据说一些旧的C程序包含这样的行.

摘自https://gcc.gnu.org/onlinedocs/cpp/Other-Directives.html#Other-Directives