分享方式:


編譯器警告 (層級 1) C5208 和錯誤 C7626

typedef 名稱中使用的未命名類別無法宣告非靜態資料成員、成員列舉或成員類別以外的成員

備註

宣告內的 typedef 未命名類別不能有以外的任何成員:

  • 沒有預設成員初始化運算式的非靜態資料成員,
  • 成員類別或
  • 成員列舉。

相同的限制會以遞迴方式套用至每個巢狀類別。 此限制旨在確保結構簡單,這些結構具有 typedef 連結用途的名稱。 在編譯器取得 typedef 連結名稱之前,它們必須足夠簡單,因此不需要連結計算。

此警告是 Visual Studio 2019 16.6 版的新功能。 根據 C++ 標準委員會採用的P1766R1 作為瑕疵報告,它會影響編譯器的所有標準模式。 在預設 /std:c++14/std:c++17 模式中,編譯器會針對不符合規範的程式碼發出警告 C5208。 如果 /permissive- 已指定,編譯器會在 下 /std:c++14 發出警告 C5208 做為錯誤。 當指定或更新版本時 /std:c++17 ,編譯器會針對不符合規範的程式碼發出錯誤 C7626。

關閉警告而不變更程式碼

您可以使用 pragma , #pragma warning(suppress : 5208) 關閉特定程式碼 warning 行的警告。 您也可以使用 warning pragma , #pragma warning(disable : 5208) 關閉檔案內的警告。 您可以使用 /wd5208 命令列選項,在命令列組建 中全域關閉警告。

若要關閉 Visual Studio IDE 中整個專案的警告:

  1. 開啟專案的 [ 屬性頁] 對話方塊。 如需如何使用 [屬性頁] 對話方塊的資訊,請參閱 屬性頁
  2. 選取 [ 組態屬性 > C/C++ > 進階 ] 頁面。
  3. 編輯停用 特定警告 屬性以新增 5208 。 選擇 [ 確定 ] 以套用變更。

範例

下列範例顯示未命名結構中不再允許的建構。 根據指定的標準模式,會發出 C5208 或 C7626 錯誤或警告:

struct Base { };
typedef struct : Base // inheriting from 'Base'; ill-formed
{
    void fn(); // ill-formed
    static int i; // ill-formed
    struct U {
        void f(); // nested class has non-data member; ill-formed
    };
    int j = 10; // default member initializer; ill-formed
} S;

您可以藉由為未命名的類別提供名稱來修正上述程式碼:

struct Base { };
typedef struct NamedType : Base
{
    void fn();
    static int i;
    struct U {
        void f();
    };
    int j = 10;
} S;