奇怪的链接情况
在 irc.freenode.net 上讨论了 ##C 中的链接之后,我去测试了我学到的一些概念,并提出了这种情况。
我有这个文件,名为 main.c:
int main(void) {
func();
return 0;
}
这个文件,名为 test.c:
#include <stdio.h>
void func(void) {
printf("Hello.\n");
}
没有 test.h 文件。
我这样做:
$ gcc -c main.c
$ gcc -c test.c
$ gcc main.o test.o
$ ./a.out
Hello.
$
这有效。 gcc 不应该在第一次调用时抱怨不知道 main.c 文件中调用的函数 func() 吗?我没有包含任何文件及其原型或实现,但 gcc 可以编译目标代码并生成正常的可执行文件。那里发生了什么我失踪的事情?
谢谢。
After some talking about linking in ##C on irc.freenode.net, I went to test some concepts I learned, and came up with this situation.
I have this file, named main.c:
int main(void) {
func();
return 0;
}
And this file, named test.c:
#include <stdio.h>
void func(void) {
printf("Hello.\n");
}
There's no test.h file.
I do this:
$ gcc -c main.c
$ gcc -c test.c
$ gcc main.o test.o
$ ./a.out
Hello.
$
and that works. Shouldn't gcc complain, on its first call, about not knowing function func() that is called in the main.c file? I didn't include any file with its prototype or implementation, and yet gcc can compile an object code and make a sane executable. What happened there that I'm missing?
Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
打开一些警告,您就会痛苦地意识到这些问题。
C 默认情况下会假设有关未知函数的事情。好的?可能不会。历史悠久。
此外,
gcc -std=c99
也会抛出警告。Turn on a few warnings and you will be made painfully aware of the problems.
C will by default assume things about unknown functions. Good? Probably not. Historical.
Also
gcc -std=c99
will throw the warning as well.它之所以有效,是因为所有参数类型都是匹配的(因为你没有任何人)。你可以通过调用 gcc -c -Wall test.c 让 gcc 抱怨
It works because all the argument types are matching (since you don't have anyone). You can make gcc complain by calling it gcc -c -Wall test.c