【发布时间】:2020-07-09 02:49:19
【问题描述】:
最近我一直在四处寻找并试图弄清楚 C 编译器是如何工作的。
我注意到不同的计算机似乎对以下操作表现出不同的行为:
// a.c
// #include"oui.h"
int main() {
oui();
}
// oui.h
void oui();
gcc -c a.c
在一台计算机上,我被警告 a.c 中的函数 oui 未定义。这对我来说很有意义,取消注释包含解决了问题。
然而,在另一台计算机上,即使将包含注释掉,编译器也会毫无怨言地生成对象a.o。这对我来说不有意义,因为没有头文件,oui 不是 undefined 吗?
什么是正常行为?我的其中一台计算机上的某些设置是否有问题?
如果您不想,请不要理会以下问题,它们只是突然出现在我的脑海中,如果需要,我会再做一个线程:)。
附带问题:-c 标志生成目标文件但不链接,那么之后是否有一个特殊的“链接”标志将目标文件放在一起,还是只是 gcc?为什么不在一开始就将所有内容 gcc 一起使用?
附带问题 #2:如果我选择 gcc filea fileb filec,那么 filea 作为第一个参数本身就很特别吗?还是 gcc 的顺序无关紧要,因为编译器会自行找到具有 main 的文件?
【问题讨论】:
-
确切的错误消息或警告是什么?
oui是 undefined 的错误会很奇怪。 未声明或隐式声明的错误是我所期望的。 -
定义和声明之间的区别在这里很关键。您可能想阅读stackoverflow.com/questions/1410563/…。
标签: gcc