預設為關閉的編譯器警告

編譯程式支援默認關閉的警告,因為大部分開發人員都找不到這些警告。 在某些情況下,他們會警告關於文體選擇,或舊版程式代碼中的常見慣用語。 其他警告是關於使用 Microsoft 擴充功能的語言。 某些警告表示程式設計人員通常會進行不正確的假設,這可能會導致非預期或未定義的行為。 如果啟用所有這些警告,其中一些警告可能會在連結庫標頭中出現多次。 C 執行時間連結庫和 C++ 標準連結庫的目的是只在警告層級 /W4發出任何警告。

啟用預設關閉的警告

您可以使用下列其中一個選項來啟用通常關閉的警告:

  • #pragma warning(default :warning_number)

    指定的警告 (warning_number) 會在其預設層級啟用。 警告的文件包含警告的預設層級。

  • #pragma warning(warning_level:warning_number)

    指定的警告 (warning_number) 會在指定的層級啟用 (warning_level)。

  • /Wall

    /Wall 會啟用所有預設停用的警告。 如果您使用此選項,您可以使用 選項來關閉個別警告 /wd

  • /wLnnnn

    此選項會在 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': unsigned/negative 常數不符
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 relative include path contains '..'
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.3Perm 中的非法限定名稱
C4598 (層級 1 和層級 3) '#include “header”': 先行編譯標頭中的標頭編號與目前編譯在 14.3 位置不符
C4599 (層級 3) 'optionpath': 命令行自變數編號 arg_number 不符合預先編譯的標頭 14.3
C4605 (層級 1) 在目前的命令行上指定的 『/D』,但在建置先行編譯標頭時未指定
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++ 標準不允許在命名空間 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 存取受限於 /volatile:<iso|ms> 設定;請考慮使用 __iso_volatile_load/store 內部函數
C4749 (層級 4) 有條件地支援:套用至非標準版面配置類型 'type' 的 offsetof
C4767 (層級 4) 區段名稱 'symbol' 超過 8 個字元,且鏈接器將會截斷
C4774 (層級 4) 'string' :自變數 編號 中預期的格式字串不是字串常值
C4777 (層級 4) 'function' :格式字串 'string' 需要類型 'type1' 的自變數,但 variadic 自變數 編號 的類型為 '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) 'fileline_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) C++20 16.7 中,『function-parameter』 具有揮發性限定類型的函式參數已被取代
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,錯誤) 隱含的落入會發生在這裡;您缺少 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

另請參閱

warning pragma