簡體   English   中英

在標頭中聲明和初始化靜態int

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM