c - 为什么编译器不会对错误的 extern 声明发出错误?

标签 c gcc clang

在 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/

相关文章:

macos - 在 Mac os 10.8 上编译 httpd 时,x86_64 出现 undefined symbol "_TLSv1_1_client_method"

c - 将版本号附加到 Eclipse 中 C 应用程序的输出文件

创建一个 wav。来自 MIDI 文件的文件并将其提供给 NWEB

c - 从函数中获取数组的计数

c - 我怎样才能找到源自 clone() 的 glibc 回溯的来源?

c++ - 在 Mac OS X 上将带和不带 RTTI 的库与 GCC 混合使用?

c - va_start 警告 "second parameter of ' va_start ' not last named argument"

c - C 文件(库)与 clang 链接器的基本使用

c++ - clang 上的静态 constexpr undefined reference 错误

c - Assembly音频合成的数据结构