預設為關閉的編譯器警告
編譯程式支援默認關閉的警告,因為大部分開發人員都找不到這些警告。 在某些情況下,他們會警告關於文體選擇,或舊版程式代碼中的常見慣用語。 其他警告是關於使用語言Microsoft延伸模組。 某些警告表示程式設計人員通常會進行不正確的假設,這可能會導致非預期或未定義的行為。 如果啟用所有這些警告,其中一些警告可能會在連結庫標頭中出現多次。 C 執行時間連結庫和C++標準連結庫僅供警告層級 /W4
發出任何警告。
啟用預設關閉的警告
您可以使用下列其中一個選項來啟用通常關閉的警告:
#pragma warning(default :
warning_number)
指定的警告 (warning_number) 會在其預設層級啟用。 警告的文件包含警告的預設層級。
#pragma warning(
warning_level:
warning_number)
指定的警告 (warning_number) 會在指定的層級啟用 (warning_level)。
-
/Wall
會啟用所有預設停用的警告。 如果您使用此選項,您可以使用 選項來關閉個別警告/wd
。 -
此選項會在 L 層級啟用警告 nnnn。
默認為關閉的警告
Visual Studio 2015 和更新版本
Visual Studio 2015 和更新版本中預設會關閉下列警告:
警告 | 訊息 |
---|---|
C4061 (層級 4) | 列舉 'enumeration' 參數中的列舉值 'identifier' 不是由大小寫標籤明確處理。 |
C4062 (層級 4) | 列舉 'enumeration' 參數中的列舉值 'identifier' 未處理。 |
C4165 (層級 1) | 'HRESULT' 正在轉換成 'bool';您確定這是您想要的嗎? |
C4191 (層級 3) | 'operator': 從 'type_of_expression' 到 'type_required' 的不安全轉換 |
C4242 (層級 4) | 'identifier': 將 'type1'轉換為 'type2',資料可能遺失 |
C4254 (層級 4) | 'operator':從 'type1' 轉換成 'type2',可能會遺失數據 |
C4255 (層級 4) | 'function': 未提供函式原型: 將 '()' 轉換為 '(void)' |
C4263 (層級 4) | 'function': 成員函式不覆寫任何基底類別虛擬成員的函式 |
C4264 (層級 1) | 'virtual_function':無法從基底 'class' 取得虛擬成員函式的覆寫;函式已隱藏 |
C4265 (層級 3) | 'class': 類別具有虛擬函式,但解構函式不是虛擬的 |
C4266 (層級 4) | 'function': 從基底 'type' 的虛擬成員函式沒有可用的覆寫;函式已隱藏 |
C4287 (層級 3) | 'operator': 不帶正負號/負常數不相符 |
C4289 (層級 4) | 使用的非標準延伸模組: 'var' : for-loop 中宣告的迴圈控制變數是在 for-loop 範圍之外使用 |
C4296 (層級 4) | 'operator': expression 一律為 false |
C4339 (層級 4) | 'type' :使用 CLR 元數據中偵測到的未定義類型 - 使用此類型可能會導致運行時間例外狀況 |
C4342 (層級 1) | 行為變更: 呼叫了 'function',但是先前版本中呼叫的是成員運算子 |
C4350 (層級 1) | 行為變更: 呼叫了 'member1' 而不是 'member2' |
C4355 | 'this' : 在基底成員初始設定式清單中使用 |
C4365 (層級 4) | 'action': 從 'type_1' 轉換成 'type_2',簽署/不帶正負號不符 |
C4370 (層級 3) | 因為較佳的封裝,類別配置已從舊版的編譯器變更 |
C4371 (層級 3) | 'class-name': 類別的版面配置可能已從舊版編譯程式變更,因為成員 'member' 的封裝較佳 |
C4388 (層級 4) | 帶正負號/不帶正負號不相符 |
C4412 (層級 2) | 'function': 函式簽章包含類型 'type';C++對象在純程式代碼與混合或原生之間傳遞不安全 |
C4426 (層級 1) | 優化旗標在包含標頭之後變更,可能是因為 #pragma optimize() 14.1 |
C4435 (層級 4) | 'class1': /vd2 下的物件配置會因為虛擬基底 'class2' 而變更。 |
C4437 (層級 4) | 從虛擬基底 『class1』 到 『class2』 dynamic_cast在某些情況下可能會失敗。 |
C4444 (層級 3) | 最上層 『__unaligned』 未在此內容中實作。 |
C4464 (層級 4 ) | 相對 Include 路徑包含 '..' |
C4471 (層級 4) | 未範圍列舉的正向宣告必須具有基礎類型 (int 假設) Perm |
C4472 (層級 1) | 'identifier' 是原生列舉:新增存取規範 (private/public) 來宣告受控列舉 |
C4514 (層級 4 ) | 'function': 已移除未參考的內嵌函式 |
C4536 (層級 4) | 'type name': type-name 超過 'limit' 字元的元數據限制 |
C4545 (層級 1) | 逗號之前的運算式判斷值為遺漏引數清單的函式 |
C4546 (層級 1) | 逗號之前的函式呼叫遺漏引數清單 |
C4547 (層級 1) | 'operator': 逗號之前的運算子無效;必須是具有副作用的運算子 |
C4548 (層級 1) | 逗號之前的運算式無效; 必須是具有副作用的運算式 |
C4549 (層級 1) | 'operator1': 逗號之前的運算符沒有作用;您打算 'operator2'嗎? |
C4555 (層級 1) | 運算式無效; 必須是具有副作用的運算式 |
C4557 (層級 3) | '__assume' 包含有效的 'effect' |
C4571 (層級 4) | informational:catch(...) 語意自 Visual C++ 7.1 起變更;已不再攔截結構化例外狀況 (SEH) |
C4574 (層級 4) | 'identifier' 定義為 '0':您是否表示使用 '#if 標識符'? |
C4577 (層級 1) | 'noexcept ' 未指定例外狀況處理模式;不保證例外狀況終止。 指定 /EHsc |
C4582 (層級 4) | 'type': 未隱含呼叫建構函式 |
C4583 (層級 4) | 'type': 未隱含呼叫解構函式 |
C4587 (層級 1) | 'anonymous_structure': 行為變更:不再隱含呼叫建構函式 |
C4588 (層級 1) | 'anonymous_structure': 行為變更:不再隱含呼叫解構函式 |
C4596 (層級 4) | 'identifier': 成員宣告 14.3 Perm 中的非法限定名稱 |
C4598 (層級 1 和層級 3) | '#include “header”': 先行編譯標頭中的標頭編號與目前編譯在 14.3 位置不符 |
C4599 (層級 3) | 'option path': 命令行自變數編號 arg_number 不符合預先編譯的標頭 14.3 |
C4605 (層級 1) | 目前的命令列上已指定 '/Dmacro',但在建置先行編譯標頭檔時沒有指定 |
C4608 (層級 3) | 'union_member' 已經由初始化表達式清單中的另一個等位成員初始化,'union_member' Perm |
C4619 (層級 3) | #pragma 警告:沒有警告編號 'number' |
C4623 (層級 4) | 'derived class': 因為無法存取基底類別預設建構函式,所以無法產生預設建構函式 |
C4625 (層級 4) | 'derived class': 因為無法存取基底類別複製建構函式,所以無法產生複製建構函式 |
C4626 (層級 4) | 'derived class': 因為無法存取基底類別的指派運算子,所以無法產生指派運算子 |
C4628 (層級 1) | 不支援使用 -Ze 的雙拼詞。 字元序列 'digraph' 未解譯為 'char' 的替代標記 |
C4640 (層級 3) | 'instance': 建構本機靜態物件不是安全線程 |
C4643 (層級 4) | C++ Standard 不允許命名空間 std 中的出現向前宣告 'identifier'。 15.8 |
C4647 (層級 3) | 行為變更: __is_pod(type) 在舊版本中具有不同值 |
C4654 (層級 4) | 置於先行編譯標頭檔一行之前的程式碼將予忽略。 將程式碼新增至先行編譯標頭檔。 14.1 |
C4668 (層級 4) | 'symbol' 未定義為預處理器巨集,以 'directives' 的 '0' 取代 |
C4682 (層級 4) | 'symbol':未指定方向參數屬性,預設為 [in] |
C4686 (層級 3) | 'user-defined type': 行為可能變更,UDT 傳回呼叫慣例中的變更 |
C4692 (層級 1) | 'function': 非私用成員的簽章包含元件私用原生類型 'native_type' |
C4710 (層級 4) | 'function': 函式未內嵌 |
C4738 (層級 3) | 在記憶體中儲存 32 位元浮點結果,可能會損失效能 |
C4746 | 'expression' 的暫時性存取受限於 /volatile:<iso|ms> 設定;請考慮使用 __iso_volatile_load/store 內建函式 |
C4749 (層級 4) | 有條件地支援:offsetof 適用於非標準配置類型 'type' |
C4767 (層級 4) | 區段名稱 'symbol' 超過 8 個字元,且鏈接器將會截斷 |
C4774 (層級 4) | 'string':引數 number 中的格式字串不得為字串常值 |
C4777 (層級 4) | 'function':格式字串 'string' 需要類型 'type1' 的引數,但 variadic 引數 number 的類型為 'type2' |
C4786 (層級 3) | 'symbol': 物件名稱在偵錯資訊中截斷為 'number' 字元 |
C4800 (層級 4) | 從 'type' 隱含轉換成 bool。 可能的信息遺失 16.0 |
C4820 (層級 4) | 在建構 'member_name' 之後新增 'bytes' 位元組填補 |
C4822 (層級 1) | 'member': 本機類別成員函式沒有主體 |
C4826 (層級 2) | 從 'type1' 到 'type2' 的轉換是帶符號的延伸。 這可能會造成未預期的執行階段行為。 |
C4837 (層級 4) | 偵測到三併詞:'?? character' 已取代為 'character' |
C4841 (層級 4) | 使用的非標準延伸模組:用於 offsetof 的復合成員指示項 |
C4842 (層級 4) | 使用多個繼承套用至類型之 『offsetof』 的結果不保證在編譯程式版本之間保持一致 |
C4866 (層級 4) | 'file(行號)' 編譯程式可能不會強制執行呼叫 運算符的由左至右評估順序 |
C4868 (層級 4) | 'file(line_number)' 編譯器可能不會在以大括號括住的初始化清單中強制執行由左到右的評估順序 |
C4905 (層級 1) | 寬字串常值轉換成 'LPSTR' |
C4906 (層級 1) | 字串常值轉換成 'LPWSTR' |
C4917 (層級 1) | 'declarator': GUID 只能與類別、介面或命名空間相關聯 |
C4928 (層級 1) | 不合法的 copy-initialization; 已經隱含套用一個以上的使用者定義的轉換 |
C4931 (層級 4) | 我們假設型別程式庫是針對 number 位元指標所建置 |
C4946 (層級 1) | reinterpret_cast在相關類別之間使用:'class1' 和 'class2' |
C4962 | 'function': 已停用配置文件引導優化,因為優化導致配置文件數據變得不一致 |
C4986 (層級 4) | 'symbol': 例外狀況規格不符合先前的宣告 |
C4987 (層級 4) | 使用非標準的擴充:'throw (...)' |
C4988 (層級 4) | 'symbol': 在類別/函式範圍外宣告的變數 |
C5022 | 'type':指定了多個移動建構函式 |
C5023 | 'type':指定了多個移動指派運算子 |
C5024 (層級 4) | 'type':移動建構函式已隱含定義為已刪除 |
C5025 (層級 4) | 'type':移動指派運算子已隱含定義為已刪除 |
C5026 (層級 1 和層級 4) | 'type':移動建構函式已隱含定義為已刪除 |
C5027 (層級 1 和層級 4) | 'type':移動指派運算子已隱含定義為已刪除 |
C5029 (層級 4) | 已使用非標準延伸模組:C++ 中的對齊屬性僅適用於變數、資料成員和標記型別 |
C5031 (層級 4) | #pragma 警告(pop):可能不相符,在不同檔案 14.1 中推送的彈出警告狀態 |
C5032 (層級 4) | 偵測到 #pragma 警告(push) 沒有對應的 #pragma 警告(pop) 14.1 |
Visual Studio 2017 和更新版本
Visual Studio 2017 和更新版本中預設會關閉下列警告:
警告 | 訊息 |
---|---|
C5034 | 使用內部 'intrinsic' 會導致函式函 式名稱 編譯為客體程式代碼 15.3 |
C5035 | 使用功能 'feature' 會導致函式函 式名稱 編譯為客體程序代碼 15.3 |
C5036 (層級 1) | 使用 /hybrid:x86arm64 'type1' 編譯為 'type2' 15.3 時,varargs 函式指標轉換 |
C5038 (層級 4) | 數據成員 'member1' 將在數據成員 'member2' 15.3 之後初始化 |
C5039 (層級 4) | 'function': 指標或參考,可能擲回傳遞至 下 extern C 函式的 -EHc 函式。 若此函式擲回例外狀況,可能會發生未定義的行為。 15.5 |
C5041 (層級 4) | 'member-name':不需要 constexpr 靜態數據成員的行外定義,而且在 C++17 中已被取代。 15.2 |
C5042 (層級 3) | 'function': 區塊範圍中的函式宣告無法在標準C++中指定 'inline';移除 'inline' 規範 15.5 |
C5045 | 如果 /Qspectre 參數指定 了 15.7,編譯程式將會插入記憶體負載的 Spectre 風險降低 |
Visual Studio 2019 和更新版本
Visual Studio 2019 和更新版本中預設會關閉下列警告:
警告 | 訊息 |
---|---|
C5052 (層級 3) | 關鍵詞 'keyword-name' 是在 C++ 版本中 引進,需要使用 'option' 命令行選項 16.1 |
C5204 (層級 3) | 具有虛擬函式的類別具有非虛擬的解構函式。 16.5 |
C5214 (層級 4) | 在 C++20 16.7 中,將 'keyword' 套用至具有揮發性限定型別的操作數已被取代 |
C5215 (層級 4) | 'function-parameter' 具有揮發性限定類型的函式參數在 C++20 16.7 中已被取代 |
C5216 (層級 4) | 'return-type' 揮發性限定傳回型別在 C++20 16.7 中已被取代 |
C5217 (層級 4) | 包含 volatile 的結構化系結宣告在 C++20 16.7 中已被取代 |
C5219 (層級 2) | 從 'type-1' 到 'type-2' 的隱含轉換,可能會遺失數據 16.7 |
C5220 (層級 4) | 'member': 具有 volatile 限定類型的非靜態數據成員不再表示 編譯程式產生的複製/移動建構函式和複製/移動指派運算元並不簡單 16.7 |
C5233 (層級 4) | 未使用明確 Lambda 擷取 'identifier' 16.10 |
C5240 (層級 4) | 'attribute-name': 在這個語法位置 16.10 中忽略屬性 |
C5243 (層級 1) | 'type-name':使用不完整的類別 'class-name' 可能會因為 ABI 限制 16.10 而造成潛在的一個定義規則違規 |
C5245 (層級 4) | 'function': 已移除具有內部連結的未參考函式 |
C5246 (層級 1) | 'member': 子物件的初始化應該以大括弧 16.10 包裝 |
C5247 (層級 1) | 區段 'section-name' 保留給C++動態初始化。 手動建立區段會干擾C++動態初始化,並可能導致未定義的行為 16.11 |
C5248 (層級 1) | 區段 'section-name' 保留給C++動態初始化。 手動放入 區段的變數可能會優化,且相對於編譯程式產生的動態初始化表達式的順序未指定 16.11 |
Visual Studio 2022 和更新版本
Visual Studio 2022 和更新版本中預設會關閉下列警告:
警告 | 訊息 |
---|---|
C5249 (層級 1) | 類型 'enumeration_name' 的 'bitfield' 擁有具名列舉程式,其值無法在 'bitfield_width' 的指定位元欄位寬度中表示。 17.0 |
C5250 (層級 3) | 'function_name': 內建函式未宣告。 17.0 |
C5251 (層級 4) | 區段名稱 在包含標頭 17.1 之後變更 |
C5254 (層級 4) | 語言功能 'terse static assert' 需要編譯程式旗標 '/std:c++17' 17.1 |
C5256 (層級 1) | 'enumeration':只有獨立宣告 17.2 才允許使用固定基礎類型的列舉型別的非定義宣告 |
C5258 (層級 4) | 此使用 17.2 不需要明確擷取 'symbol' |
C5259 (層級 4) | 'specialized-type':明確特製化需要 'template <> ' 17.3 |
C5262 (層級 1,錯誤) | 這裡發生隱含的 fall-through; 是否遺漏 break 陳述式? [[fallthrough]] 在案例 17.4 之間刻意省略 語句時break 使用 |
C5263 (層級 4) | 在暫存物件上呼叫 『std::move ' 會防止複製 elision 17.4 |
C5264 (層級 4) | 'variable-name': 'const' 變數未使用 17.4 |
C5266 (層級 4) | 傳回型別的 'const' 限定符沒有效果 17.6 |
C5267 (層級 4) | 'type' 的隱含複製建構函式/指派運算符定義已被取代,因為它具有使用者提供的指派運算符/複製建構函式 17.7 |
14.1 從 Visual Studio 2015 Update 1 開始,即可使用此警告。
14.3 從 Visual Studio 2015 Update 3 開始提供此警告。
15.2 從 Visual Studio 2017 15.2 版開始提供這個警告。
15.3 從 Visual Studio 2017 15.3 版開始,即可使用此警告。
15.5 從 Visual Studio 2017 15.5 版開始提供這個警告。
15.7 從 Visual Studio 2017 15.7 版開始提供此警告。
15.8 從 Visual Studio 2017 15.8 版開始提供這個警告。
16.0 從 Visual Studio 2019 RTM 開始提供這個警告。
16.5 從 Visual Studio 2019 16.5 版開始提供此警告。
16.7 從 Visual Studio 2019 16.7 版開始提供這個警告。
16.10 從 Visual Studio 2019 16.10 版開始提供這個警告。
16.11 從 Visual Studio 2019 16.11 版開始提供這個警告。
17.0 從 Visual Studio 2022 17.0 版開始提供這個警告。
17.1 從 Visual Studio 2022 17.1 版開始,即可使用此警告。
17.2 從 Visual Studio 2022 17.2 版開始,即可使用此警告。
17.3 從 Visual Studio 2022 17.3 版開始,即可使用此警告。
17.4 從 Visual Studio 2022 17.4 版開始提供這個警告。
17.5 從 Visual Studio 2022 17.5 版開始,即可使用此警告。
17.6 從 Visual Studio 2022 17.6 版開始提供這個警告。
17.7 從 Visual Studio 2022 17.7 版開始提供這個警告。
Perm 除非已設定編譯程式選項, /permissive-
否則這個警告會關閉。
舊版預設會關閉警告
Visual Studio 2015 15.3 版預設會關閉此警告,並在 Visual Studio 2015 15.5 版中啟用:
警告 | 訊息 |
---|---|
C4768 | __declspec 忽略連結規格之前的屬性 |
這些警告預設會在 Visual Studio 2015 之前的編譯程式版本中關閉:
警告 | 訊息 |
---|---|
C4302 (層級 2) | 'conversion': 從 'type1' 到 'type2' 發生截斷狀況 |
C4311 (層級 1) | 'variable': 從 'type' 到 'type' 的指標截斷 |
C4312 (層級 1) | 'operation': 將 'type1' 轉換為較大的 'type2' |
C4319 (層級 1) | 'operator': 零擴展 'type1' 至更大的 'type2' |
在 Visual Studio 2012 之前的編譯程式版本中,預設會關閉此警告:
警告 | 訊息 |
---|---|
C4431 (層級 4) | 遺漏類型規範 - 假設為 int。 注意: C 已不再支援 default-int |