为什么编译器没有为错误的extern声明发出错误?

Nic*_*ick 1 c gcc clang

在file1上我将变量args定义为:

CLA args;
Run Code Online (Sandbox Code Playgroud)

在file2上我已将其声明为:

extern CLA* args;
Run Code Online (Sandbox Code Playgroud)

该程序将使用gcc和clang编译而没有错误,并且valgrind上也不会出现任何错误.但是有一个问题:在file2上,函数fprintf(args-> output,...)不会打印任何东西.为什么没有发出错误?

Jon*_*art 5

该程序将使用gcc和clang进行编译,没有错误

因为每个C文件都是独立编译的.生成的目标文件链接后,链接器只有符号名称.它不知道与这些符号相关的类型.

这是原因之一1即C++使用名称重整:符号的类型被嵌入在它的名字,因此如果有不匹配,将发生链路故障.

这就是为什么要么不使用全局变量,要么在头文件中声明它们,并在引用全局的任何地方包含该头文件,包括定义它的单元.

没有理由extern出现在.c文件中; 只在一个.h文件中.

并且valgrind上也不会出现任何错误.

我们还没有看到您的源代码,所以我们无法知道您如何错误地使用所述变量,以便valgrind可以检测到它.


1 - 另一个主要原因是支持重载功能.