<分区>
//File a.c
void main()
{
test();
}
//File b.c
#include<stdio.h>
void test()
{
printf("Hi, I am test.");
}
我使用“gcc a.c b.c”编译这段代码。然后我运行“a.out”并输出“嗨,我正在测试”。我的问题是在 a.c 文件中没有 test() 声明,那么为什么代码可以编译?
标签 c
<分区>
//File a.c
void main()
{
test();
}
//File b.c
#include<stdio.h>
void test()
{
printf("Hi, I am test.");
}
我使用“gcc a.c b.c”编译这段代码。然后我运行“a.out”并输出“嗨,我正在测试”。我的问题是在 a.c 文件中没有 test() 声明,那么为什么代码可以编译?
最佳答案
默认情况下,C 中的函数是 extern
,这意味着链接器甚至可以将文件 a
中的函数连接到文件 b
如果没有程序员编写的#include
或extern
。
我的 gcc 编译它时出现了这个警告:warning: implicit declaration of function...
意思是,通过查看 test();
编译器猜测什么 test
是,并且继续。如果您将 test
定义为 static
那将会失败,因为 static
与默认的 extern
我认为您应该注意的一件事是,此隐式声明
还使编译器猜测 test
的返回类型,并且它会认为类型是 int
。这可能会导致问题。
关于在没有声明的情况下调用另一个文件中的函数不会产生编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45399030/