簡體   English   中英

應該在c ++頭文件中初始化const靜態變量嗎?

[英]Should a const static variable be initialized in a c++ header file?

my_test.h

#ifndef MY_TEST  
#define MY_TEST

struct obj {
  int x;
  int y;
};

class A {
private:
  const static int a=100;
  const static obj b;
};

const obj A::b={1,2};

#endif

使用此頭文件編譯cpp時,會出現錯誤'multiple definition of 'A::b'

  1. 為什么我已經使用了守衛宏呢?
  2. A::a為什么不產生錯誤? (我不能在class A編寫代碼const static obj b={1,2}

為什么我已經使用了守衛宏呢?

標題保護僅阻止在同一個翻譯單元中多次包含頭文件內容而不是多個翻譯單元。

為什么A::a沒有錯誤信息(我不能在class A編寫代碼const static obj b={1,2}

編譯器允許類內初始化作為const文字類型的靜態數據成員的特殊情況。 你的例子是In-class初始化。

const A::b在每個翻譯單元中定義相同的符號名稱,其中包含標題,因此打破了一個定義規則

您需要將定義移動到一個且僅一個源cpp文件,以便僅定義一次。

Alok已經回答了你的問題,但這里有一些簡單的經驗法則,易於記憶:

  1. 聲明放在.h文件中
  2. 定義放在.cpp文件中

因此,靜態成員需要在.h文件中聲明 ,然后在.cpp文件中定義 在您的情況下,修復聲明的語法,然后將它們移動到“my_test.cpp”文件。

問題是你對A::b定義不包含類型。 要成為有效的定義,它應該是:

const obj A::b = {1, 2};

這將消除編譯錯誤,但如果將此標頭包含在多個源文件中,您仍會遇到鏈接器錯誤,因為A::b將被多重定義。 您應該將定義移動到.cpp文件中。

無論您是否有頭文件保護,將初始化放在頭文件中意味着您將在包含該頭文件的每個源文件中獲得A::b的實例。 因此鏈接器錯誤。

所以,一般來說,這是可能的,但不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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