我以前遇到以下問題,並已下意識地避免它至今,但從來沒有完全理解爲什麼它正在發生。有人可以向我解釋以下問題嗎?恆指針
在頭文件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'
時即使有在頭文件中後衛的條件,只有一個得到以下錯誤發生問題的定義。這似乎適用於我放置在頭文件中的任何指針,但不適用於常規常量,如ok
或fine
。
如果我改變問題到非恆定:char* problem = "Problem"
我得到過時的轉換警告而不是多個定義,它編譯。
我使用G ++ 4.6.3和Code :: Blocks的12.11
更新: 有重新測試使用g ++ 4.7.1(有和沒有代碼::塊),並不再獲得的問題。對於那些誰建議選用extern
或static
是否有其他原因,使用那些在這樣的情況下(你只想要一個簡單的C字符串常量)比compataibility其他與舊的編譯器?
你'包括從Library.h'其他'cpp'文件不是'主其他。 cpp'? – 2013-05-11 09:42:10
沒有這個例子是完整的,沒有涉及其他文件。在任何情況下,更改爲非const仍然會導致問題。 – DuncanACoulter 2013-05-11 09:43:54
東西告訴我,在這裏你需要'extern' – deepmax 2013-05-11 09:44:56