在file1上我将变量args定义为:
CLA args;
在file2上我已将其声明为:
extern CLA* args;
程序将使用gcc和clang编译而没有错误,并且valgrind上也不会出现错误。但是有一个问题:在file2上,函数 fprintf(args-> output,...)不会打印任何内容。为什么没有发出错误?
答案 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 */