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

时间:2014-08-27 10:57:36

标签: c

此代码可由gcc -g -o main main.c编译,无需警告。

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

我的问题是:

  1. operator&#34;#&#34;是什么意思?之前&#34;包括&#34;。我们使用#include <stdio.h>来包含头文件,为什么不使用include <stdio.h>

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

  3. 任何人都可以帮助我?

2 个答案:

答案 0 :(得分:8)

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

# 41 "stdio.h"

可以解释为:

  • 41的含义是:
  

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

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

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

所有这些信息都来自https://gcc.gnu.org/onlinedocs/cpp/Line-Control.html#Line-Controlhttps://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> includedefineundefline,{{1 }或error,然后它是非指令(6.10p1),并被忽略。

这意味着行开头的pragma是编译器在翻译阶段之间传递信息的简单方法;这里它用于传递源文件和行号信息。