[英]Declaring and initializing a static int in a header
如果我在頭文件中有以下內容:
foo.h中
Foo
{
public:
static const int BAR = 1234;
...
};
我是否還需要在.cpp中定義變量,例如:
Foo.cpp中
const int Foo::BAR;
我們有一個問題,在標頭中初始化靜態似乎可以在MS編譯器上運行,但是在Mac上使用gcc時,似乎會出現鏈接器錯誤。
就像編寫它們一樣,您需要聲明和定義。
由於它是整數,因此您可以在聲明中對其進行初始化,並且編譯器應盡可能將其視為編譯時常量。 但是它仍然需要源文件中的一個(並且只有一個)定義,否則當您不能將其視為常量時,您將獲得鏈接錯誤。
顯然,Microsoft認為標准行為過於混亂,因此“擴展”了該語言,無法將聲明以初始化程序作為定義。 看到這個問題 。 結果是,如果您還正確定義符號,則會出現鏈接錯誤(多重定義的符號)。 您可以通過禁用語言擴展( /Za
)獲得標准行為。
第一個片段適用於某些環境,但是某些編譯器確實需要定義,當然,如果使用常量地址,則當然需要。
如果您不想觸摸標頭和正文以引入常量,那么仍然有舊的枚舉技巧:
class A
{
public:
enum { someconstant=1234 };
};
使某些常量可用作編譯時常量,而無需在體內進行定義。
聲明應在標題中完成,而初始化應在.cpp上完成
有一個關於靜態成員變量一篇有趣的文章在這里 。
頭文件
Foo
{
public:
static const int BAR;
...
};
代碼文件
const int Foo::BAR = 1234;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.