C语言:运算符的含义#&引用?

C语言:运算符的含义#&引用?,c,C,此代码可以通过gcc-g-o main.c编译,没有警告 // main.c # 41 "stdio.h" # 22 # int main(void){ (void)printf("foo"); return 0; } 我的问题是: “include”之前的运算符“#”是什么意思。我们使用#include来包含头文件,为什么不使用include 为什么#22或#41可以编译,我以前从未见过 任何人都可以帮我吗?一行开头的#引入了预处理指令。从概念上讲,预处理是翻译的早期阶段,而

此代码可以通过
gcc-g-o main.c
编译,没有警告

// main.c
# 41 "stdio.h"
# 22
#
int main(void){
    (void)printf("foo");
    return 0;
}
我的问题是:

  • “include”之前的运算符“#”是什么意思。我们使用
    #include
    来包含头文件,为什么不使用
    include

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

  • 任何人都可以帮我吗?

    一行开头的
    #
    引入了预处理指令。从概念上讲,预处理是翻译的早期阶段,而不是编译阶段,这就是为什么它使用易于识别的语法

    如果
    #
    后面跟有除
    包含
    定义
    未定义
    错误
    杂注
    以外的任何内容,则它是一个非指令(6.10p1),将被忽略


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

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

    # 41 "stdio.h"
    
    可以解释为:

    • 41具有以下含义:
    它指定应为下一行输入报告的行号。后续行从linenum开始计数

    • “stdio.h”
      只是从中获取行的文件名
    下一行和所有后续行都是 报告来自它指定的文件,直到发生其他事情 改变这个。文件名根据字符串的常规规则进行解释 常量:反斜杠转义被解释

    所有这些信息都来自和

    对于单个
    #

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


    取自

    检查此项bro@mkpchiran:您的链接无法解释上述问题。