首頁 >後端開發 >C++ >為什麼在 C 類中定義靜態常數整數成員時會出現連結器錯誤?

為什麼在 C 類中定義靜態常數整數成員時會出現連結器錯誤?

Linda Hamilton
Linda Hamilton原創
2024-12-01 13:14:09232瀏覽

Why Do I Get a Linker Error When Defining Static Const Integer Members in a C   Class?

在類別定義中定義靜態常數整數成員時出現連結器錯誤

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn