在C中,为什么不';当我在另一个文件中以不同的数据类型声明一个全局变量时,我不会出错吗?

在C中,为什么不';当我在另一个文件中以不同的数据类型声明一个全局变量时,我不会出错吗?,c,extern,C,Extern,我尝试了以下代码: 文件1.c: int x; 文件2.c: extern char x; main() { x=10; .... .... } 并汇编为 $gcc File1.c File2.c 我没有收到任何错误,但我希望收到一个。在文件.c中,您向编译器保证x是char类型。由于每个翻译单元都是单独编译的,因此编译器无法验证这一点,只能相信你的话。链接器不做任何类型检查。您最终会得到一个生成时没有错误的无效程序 这就是为什么您应该使用头文件。如果File1.c和

我尝试了以下代码:

文件1.c:

int x;
文件2.c:

extern char x;
main()
{
    x=10;
    ....
    ....
}
并汇编为

$gcc File1.c File2.c


我没有收到任何错误,但我希望收到一个。

文件.c
中,您向编译器保证
x
char
类型。由于每个翻译单元都是单独编译的,因此编译器无法验证这一点,只能相信你的话。链接器不做任何类型检查。您最终会得到一个生成时没有错误的无效程序


这就是为什么您应该使用头文件。如果
File1.c
File2.c
都从同一个头中获得了
extern
x
声明,那么在编译
File1.c
时会出现错误(因为定义与声明不匹配)。[Hat tip@stevenjessop]

-Wall
编译,看看你是否收到警告可能会重复使用强大的力量带来强大的责任感就是这样。而且,由于10既是有效的
int
又是有效的
char
,编译工作正常。感谢Steve向我澄清这一点。但是我很好奇,现在我在文件1中将全局变量x初始化为char,并在文件2中声明为int,我已经输入了char无法处理的值1000并打印了它。根据您的解释,现在我预期会出现运行时错误,但我没有得到一个。@BillHicks:the代码的行为未定义()。它不必崩溃或出现运行时错误。它可以在其他方面自由地出现故障。@Fabien:不,编译工作正常,因为编译器不知道您要将编译File2.c的结果与编译File1.c的结果联系起来,后者将x定义为int。@Axel是的,但是如果在File2.c中,它被定义为,比如说,“extern char*”,编译器会因此而抱怨的。