2012-07-08 168 views
0

我在一個類的頭文件中包含一個帶有全局提升信號的.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

回答

2

您的鏈接是正確的。每次包含此頭文件時,符號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

4

你會得到一個鏈接器錯誤,而不是編譯器錯誤。所以,預處理指令在這裏不會幫助你。

你需要做的是在源文件中定義變量(而不是頭文件),並在頭文件中使用extern聲明。