奇怪的链接情况

发布于 2024-11-16 15:22:46 字数 544 浏览 5 评论 0原文

在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江挽川 2024-11-23 15:22:46

打开一些警告,您就会痛苦地意识到这些问题。

> gcc -Wall -c main.c
main.c: In function ‘main’:
main.c:2:5: warning: implicit declaration of function ‘func’

C 默认情况下会假设有关未知函数的事情。好的?可能不会。历史悠久。

此外,gcc -std=c99 也会抛出警告。

Turn on a few warnings and you will be made painfully aware of the problems.

> gcc -Wall -c main.c
main.c: In function ‘main’:
main.c:2:5: warning: implicit declaration of function ‘func’

C will by default assume things about unknown functions. Good? Probably not. Historical.

Also gcc -std=c99 will throw the warning as well.

ι不睡觉的鱼゛ 2024-11-23 15:22:46

它之所以有效,是因为所有参数类型都是匹配的(因为你没有任何人)。你可以通过调用 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文