全局变量多重声明

问题描述:

我在一个类的头文件中包含一个带有全局提升信号的.h文件,该文件又被包含在主函数的文件中。链接器说这个信号是多次声明的。信号声明封装在典型的C/C++头文件(用于避免多重声明)的#ifndef#define#endif块中。 我使用Eclipse和gcc。全局变量多重声明

#ifndef SIG_HEADER 
#define SIG_HEADER 
#include <boost/signal.hpp> 

boost::signal0 <void> signal1; 

#endif 

我做错了什么?

+6

您正在头文件中定义一个变量。 – 2012-07-08 20:57:54

您的链接是正确的。每次包含此头文件时,符号signal1都会被定义,导致多重定义错误。

为了解决问题,关键字extern将告诉编译器这是一个对象,整个程序将访问该对象并需要外部链接。然后你必须给编译器一个其他地方的变量定义,就像在这个头文件的cpp文件中一样。

This question offers some more information about external linkage.

+0

谢谢我不习惯使用我无法解决问题的全局变量。然而,尽管我打算定义一个包含现有增强信号的Singleton,但我仍然很想理解我错过的东西。 – Sindico 2012-07-08 21:31:21

+0

不错,你不习惯全局变量。 – daramarak 2012-07-08 22:19:47

你会得到一个链接器错误,而不是编译器错误。所以,预处理指令在这里不会帮助你。

你需要做的是在源文件中定义变量(而不是头文件),并在头文件中使用extern声明。