2011-06-21 134 views
1

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

谢谢。

回答

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也会发出警告。

+0

非常感谢! – jpmelos

+1

一个很好的方式指出你应该始终使用-Wall。也许吧 - 哇。可能是渺小的。 –

2

它的工作原理是因为所有参数类型都匹配(因为您没有任何人)。您可以通过调用gcc来使gcc抱怨gcc -c -Wall test.c

+0

非常感谢! – jpmelos