【发布时间】: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的第一行之前,编译器查看了所有这些地方 -
列在带有# 符号的行中。并非所有这些都是文件系统中存在的真实文件,例如
<built-in>或<command-line>,但它们的功能与普通文件一样。因此编译器查看了“prova.c”的第 1 行,然后查看了一些名为<built-in>的内部事物,然后查看了名为<command-line>等的其他内部位置,然后返回到“prova.c”的第 1 行.下一行int main(int argc, char* argv[]) {来自“prova.c”的第 1 行。之后的行来自“prova.c”的第 2 行。这种情况一直持续到看到以#开头的另一行。
标签: gcc macros c-preprocessor