在 file1 上,我将变量 args 定义为:
CLA args;
在 file2 上,我将其声明为:
extern CLA* args;
该程序将使用 gcc 和 clang 编译而不会出现错误,并且在 valgrind 上也不会出现错误。但是有一个问题:在 file2 上,函数 fprintf(args->output, ...) 不会打印任何内容。为什么没有发出错误?
最佳答案
The program would compile with both gcc and clang with no errors
因为每个C文件都是独立编译的。链接生成的目标文件时,链接器只有符号名称。它不知道与这些符号关联的类型。
这是1C++使用name mangling的原因之一:符号的类型嵌入在它的名字中,所以如果不匹配,链接失败会发生。
这就是为什么您要么不使用全局变量,要么在头文件中声明它们,并在引用所述全局变量的所有地方包含该头文件,包括定义它的单元。
extern
永远不会出现在 .c
文件中;仅在 .h
文件中。
and no errors would appear on valgrind either.
我们还没有看到您的源代码,所以我们无法知道您如何以 valgrind 可以检测到的方式错误地使用所述变量。
1 - 另一个主要原因是支持重载函数。
关于c - 为什么编译器不会对错误的 extern 声明发出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38405694/