这段代码可以编译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)
我的问题是:
"include"之前运算符"#"的含义是什么.我们#include <stdio.h>
用来包含头文件,为什么不include <stdio.h>
呢?
为什么# 22
或# 41
可以编译,我以前从未见过它.
有人可以帮帮我吗?
这看起来像预处理器的输出.这条线
# 41 "stdio.h"
Run Code Online (Sandbox Code Playgroud)
可以解释为:
它指定应为下一行输入报告的行号.后续行从亚麻布计算.
"stdio.h"
只是从中获取行的文件名.报告以下行和所有后续行来自它指定的文件,直到发生其他更改.filename根据字符串常量的常规规则进行解释:解释反斜杠转义.
所有这些信息都来自https://gcc.gnu.org/onlinedocs/cpp/Line-Control.html#Line-Control和https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html #预处理程序输出
对于单身#
:
null指令由一个'#'后跟一个换行符组成,中间只有空格(包括注释).null指令被理解为预处理指令,但对预处理器输出没有影响.存在空指令的主要意义在于,仅由'#'组成的输入行将不产生输出,而不是仅包含'#'的输出行.据说一些旧的C程序包含这样的行.
摘自https://gcc.gnu.org/onlinedocs/cpp/Other-Directives.html#Other-Directives