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

时间:2016-07-15 22:13:15

标签: c gcc clang

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

CLA args;

在file2上我已将其声明为:

extern CLA* args;

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

2 个答案:

答案 0 :(得分:5)

  

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

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

这是 1 的原因之一,C ++使用 name mangling :符号的类型嵌入其名称中,因此如果不匹配,链接失败会发生。

这就是为什么要么不使用全局变量,要么在头文件中声明它们,并在所引用的全局包括定义它的单位中包含该头文件。

extern文件永远不会出现在.c文件中;仅在.h文件中。

  

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

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

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

答案 1 :(得分:2)

请执行以下操作:

创建一个标题文件,让我们称之为globals.h。它看起来应该类似于:

#ifndef GLOBALS_H
#define GLOBALS_H

/* include whatever you need, declare the CLA type */

extern CLA *args;

/* define/declare/etc. whatever you need here. */

#endif

在第一个文件中,执行:

#include "globals.h"

在第二个文件中,执行:

#include "globals.h"

/* rest of code here */

CLA *args = NULL;

/* more code here */