【发布时间】:2018-11-11 23:28:30
【问题描述】:
我是链接的初学者,如果我的问题太基本,请见谅。假设我有两个 .c 文件
file1.c 是
int main(int argc, char *argv[])
{
int a = function2();
return 0;
}
file2.c 是
int function2()
{
return 2018;
}
我知道规范是,创建一个 file2.h 并将其包含在 file1.c 中,我有一些问题:
第一季度。 #include in file1.c 对我来说并没有太大的区别或改进,我仍然可以在没有 file2.h 的情况下正确编译 file1.c,编译器只会警告我 'implicit declaration of function 'function2',但是这个警告有很大帮助吗?程序员可能知道 function2 是在其他 .c 文件中定义的(如果您使用 function2 但未定义它,您当然知道该定义在其他地方)并且链接器将完成其工作以生成最终的可执行文件?所以 include file2,c 对我来说的唯一目的是,在编译过程中不要显示任何警告,我的理解是否正确。
第二季度。想象一下这种情况,程序员在file1.c中定义了function2,他不知道他的function2与file2.c中的那个冲突,直到链接器抛出错误(显然他可以正确编译他的file1.c。但是如果我们希望他在编译他的file1.c时知道他的错误,添加file2.h仍然没有帮助,那么添加头文件的目的是什么?
第三季度。我们应该添加什么让程序员知道他应该为 function2 选择一个不同的名称,而不是在最后阶段被链接器告知错误。
【问题讨论】:
-
假设函数是
double function2(char *str)现在你认为编译器将如何处理假设(或曾经假设)int参数和返回值的“隐式”函数?头文件的一个目的是使函数原型可用。 -
这样的话,编译器肯定会报错,但是即使程序员使用了正确的原型,如果他定义了自己的function2,那么链接器也会报错,我们该如何停止或者抛出编译的时候报错,可以在早期发现问题?
-
让链接器通知您重复有什么问题?为什么您希望编译器在编译一个模块时查看所有其他 C 源文件?这似乎不会在每个编译/链接周期中发生,或者会节省大量时间。
-
@amjad
the compiler will throw an error for sure不,它会警告你,使用了隐式函数声明。 -
@KamilCuk 不行,编译器肯定会报错,你可以试试 gcc -s 看看
标签: c header-files compiler-warnings