奇怪的链接情况

时间:2011-06-21 17:49:51

标签: c gcc linker header-files

在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可以编译目标代码并生成一个合理的可执行文件。那里发生了什么,我失踪了?

谢谢。

2 个答案:

答案 0 :(得分:8)

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

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

默认情况下,C会假设未知函数。好?可能不是。历史。

同样gcc -std=c99也会发出警告。

答案 1 :(得分:2)

它起作用,因为所有参数类型都匹配(因为你没有任何人)。你可以通过调用gcc -c -Wall test.c来让gcc抱怨。