2013-05-11 34 views
1

我以前遇到以下問題,並已下意識地避免它至今,但從來沒有完全理解爲什麼它正在發生。有人可以向我解釋以下問題嗎?恆指針

在頭文件Library.h

#ifndef LIBRARY_H 
#define LIBRARY_H 

#include <string> 

const char ok = 'K'; 

const char* problem = "Problem"; 
const std::string fine = "Fine"; 

#endif 

在包括主文件main.cpp

#include "Library.h" 

using namespace std; 

int main() 
{ 
    return 0; 
} 

我編譯multiple definition of 'problem'時即使有在頭文件中後衛的條件,只有一個得到以下錯誤發生問題的定義。這似乎適用於我放置在頭文件中的任何指針,但不適用於常規常量,如okfine

如果我改變問題到非恆定:char* problem = "Problem"我得到過時的轉換警告而不是多個定義,它編譯。

我使用G ++ 4.6.3和Code :: Blocks的12.11

更新: 有重新測試使用g ++ 4.7.1(有和沒有代碼::塊),並不再獲得的問題。對於那些誰建議選用externstatic是否有其他原因,使用那些在這樣的情況下(你只想要一個簡單的C字符串常量)比compataibility其他與舊的編譯器?

+0

你'包括從Library.h'其他'cpp'文件不是'主其他。 cpp'? – 2013-05-11 09:42:10

+0

沒有這個例子是完整的,沒有涉及其他文件。在任何情況下,更改爲非const仍然會導致問題。 – DuncanACoulter 2013-05-11 09:43:54

+0

東西告訴我,在這裏你需要'extern' – deepmax 2013-05-11 09:44:56

回答

2

「問題」這裏是該字符串"Problem"不能保證是每一個包括報頭的時間相同。

您可以通過使用static

static const char* problem = "Problem"; 

但是,解決這個問題,如果你希望看到在多個源文件相同的變量problem,將不能工作。在這種情況下,你需要做的是:

extern const char* problem; 

,然後在library.cpp或一些這樣的:

const char* problem = "Problem"; 
+0

注意到較新版本的編譯器修復了此問題。你還會推薦使用'static'和'extern'嗎?同樣,每次包含標題時都是一樣的,由於防止了多重包含,這不是一個非問題嗎? – DuncanACoulter 2013-05-11 10:53:05

+0

是的,我會的。如果你使用靜態的,那麼你將有多個具有不同地址的'問題'變量[和它們指向的'問題'字符串也可能不是同一個] - 因此它不是同一個變量。這可能不是問題,它取決於你如何使用變量。 – 2013-05-11 11:37:51