編譯程式警告 (層級 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;