【问题标题】:What do these lines from gcc mean?gcc 中的这些行是什么意思?
【发布时间】:2025-12-17 17:30:05
【问题描述】:

我正在终端上运行 prova.c 文件。
我用命令行运行 GCC:

gcc -Wall -std=c99 -E prova.c  

prova.c:

 int main(int argc, char* argv[]) {
           int a=1;
           int b=2;
           return a+b;   
    }


标准输出:

# 1 "prova.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "prova.c"
int main(int argc, char* argv[]) {
  int a=1;
  int b=2;
  return a+b;
}

每行开头都有哈希是什么意思?
为什么我们需要生成它们?
如果您有时间,我希望对每一行都有一个比一般答案更多的解释。我知道其中一些是线标记。
如果您知道有关该主题的资源,分享它们会很棒。

【问题讨论】:

  • 将 -E 开关传递给 gcc 时,您期望什么?
  • 我并不是说我没想到它们,我只是想知道为什么会生成它们以及它们的确切含义。它们必须具有某种效用或意义,否则生成它们将毫无意义!
  • “跟随”一词的意思是它通常的意思,即“紧随其后的那个”。 “起源”一词的意思是它通常的意思,即“来自”。所以# 1 "prova.c" 之后的行来自文件"prova.c" 中的第1 行。除非在您的情况下,这并不完全正确,因为第一个 # 1 "prova.c" 之后的行是带有 # 符号的另一行。这与 gcc 文档有点不准确。它应该只适用于常规的下一行,没有# 符号。但是您可以确定,在返回prova.c 的第一行之前,编译器查看了所有这些地方
  • 列在带有# 符号的行中。并非所有这些都是文件系统中存在的真实文件,例如&lt;built-in&gt;&lt;command-line&gt;,但它们的功能与普通文件一样。因此编译器查看了“prova.c”的第 1 行,然后查看了一些名为 &lt;built-in&gt; 的内部事物,然后查看了名为 &lt;command-line&gt; 等的其他内部位置,然后返回到“prova.c”的第 1 行.下一行 int main(int argc, char* argv[]) { 来自“prova.c”的第 1 行。之后的行来自“prova.c”的第 2 行。这种情况一直持续到看到以# 开头的另一行。

标签: gcc macros c-preprocessor


【解决方案1】:

这不是你喜欢的完整答案,但它可以给你一些提示。

gcc-E 参数执行(link)

在预处理阶段后停止;不要正确运行编译器。输出采用预处理源代码的形式,发送到标准输出。

这解释了你得到的命令# 1。现在,您可以转到有关预处理器输出here 的文档。它说:

‘1’ 这表示新文件的开始。

我不确定# 1 块中的命令。

【讨论】:

  • 感谢您的帮助!无论如何,您难道不好奇它们到底是什么意思吗?
  • 我是。也许没有你那么多:)
  • 好吧,希望有人能启发我!