12

我尝试了以下代码:

文件1.c:

int x;

文件2.c:

extern char x;
main()
{
    x=10;
    ....
    ....
}

并编译为

$gcc 文件 1.c 文件 2.c

我没有收到任何错误,但我期待一个。

4

1 回答 1

18

File.c中,您向编译器承诺x类型为char. 由于每个翻译单元都是单独编译的,编译器无法验证这一点,并相信你的话。并且链接器不做任何类型检查。您最终会得到一个构建时没有错误的无效程序。

这就是为什么你应该使用头文件。如果File1.cFile2.c都从同一个头文件中得到extern声明x,那么编译时会出错File1.c(因为定义与声明不匹配)。[帽子提示@SteveJessop]

于 2013-03-22T09:11:33.890 回答