此代码可由gcc -g -o main main.c
编译,无需警告。
// main.c
# 41 "stdio.h"
# 22
#
int main(void){
(void)printf("foo");
return 0;
}
我的问题是:
operator&#34;#&#34;是什么意思?之前&#34;包括&#34;。我们使用#include <stdio.h>
来包含头文件,为什么不使用include <stdio.h>
?
为什么可以编译# 22
或# 41
,我以前从未见过它。
任何人都可以帮助我?
答案 0 :(得分:8)
这看起来像预处理器的输出。这条线
# 41 "stdio.h"
可以解释为:
它指定应为下一行输入报告的行号。后续行从亚麻布计算。
"stdio.h"
只是从中获取这些行的文件名。以下行和所有后续行 报告来自它指定的文件,直到发生其他事情 改变这一点。 filename根据字符串的常规规则进行解释 常量:反斜杠转义被解释。
所有这些信息都来自https://gcc.gnu.org/onlinedocs/cpp/Line-Control.html#Line-Control和https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html#Preprocessor-Output
对于单#
:
null指令由一个'#'后跟一个换行符组成,其间只有空格(包括注释)。 null指令被理解为预处理指令,但对预处理器输出没有影响。存在空指令的主要意义在于,仅由'#'组成的输入行将不产生输出,而不是仅包含'#'的输出行。据说一些旧的C程序包含这样的行。
取自https://gcc.gnu.org/onlinedocs/cpp/Other-Directives.html#Other-Directives
答案 1 :(得分:2)
行开头的#
引入了预处理指令。预处理在概念上是翻译的早期阶段,而不是编译,这就是为什么它使用易于识别的语法。
如果#
后跟 <{em> include
,define
,undef
,line
,{{1 }或error
,然后它是非指令(6.10p1),并被忽略。
这意味着行开头的pragma
是编译器在翻译阶段之间传递信息的简单方法;这里它用于传递源文件和行号信息。