編譯器警告 (層級 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 中整個專案的警告:
- 開啟專案的 [ 屬性頁] 對話方塊。 如需如何使用 [屬性頁] 對話方塊的資訊,請參閱 屬性頁 。
- 選取 [ 組態屬性 > C/C++ > 進階 ] 頁面。
- 編輯停用 特定警告 屬性以新增
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;