在類別定義中定義靜態常數整數成員時出現連結器錯誤
C 中的類別聲明允許在班級。但是,使用者可能會遇到類似於所提供範例的程式碼的連結器錯誤:
class test { public: static const int N = 10; }; int main() { std::cout << test::N << "\n"; std::min(9, test::N); }
雖然編譯器接受類別定義,但連結器會報告對 test::N 的未定義引用。出現這個問題是因為類別中的聲明不是真正的定義。
在 C 中,靜態 const 整數成員必須在類別外部的命名空間範圍內定義。這是因為根據C 標準(9.4.2/4),它們無法在類別聲明中初始化:
如果靜態資料成員是const 整數或const 枚舉類型,則其在類別定義中的聲明可以指定常數初始值設定項[...] 在這種情況下,該成員可以出現在整數常數表達式中。如果在程式中使用該成員,則仍應在命名空間範圍內定義,且命名空間範圍定義不應包含初始值設定項。
要解決連結器錯誤,可以在類別外部定義靜態const 成員,通常在對應的來源檔案中:
const int test::N = 10;
或者,對於C 11 及更高版本,constexpr 關鍵字可用於在類別中建立真正的定義聲明:
class test { public: static constexpr int N = 10; };
以上是為什麼在 C 類中定義靜態常數整數成員時會出現連結器錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!