編譯程式警告 (層級 1) C5105
產生 'defined' 的巨集展開中有未定義的行為
備註
預處理器偵測到 defined
巨集擴充輸出中的運算符。 defined
如果運算符顯示為巨集擴充的結果,C 標準會將行為指定為未定義。 C5105 警告是可移植性和標準一致性警告,因為其他一致性編譯程式可能會有不同的行為。 若要解決此問題,請將 運算子移 defined
出巨集,或隱藏警告 C5105。
Microsoft特定行為:MSVC 編譯程式 defined
通常會評估運算符,即使在 下 /permissive-
也是如此。
此警告是Visual Studio 2017 15.8版的新功能。 它只會由編譯程式選項所 /experimental:preprocessor
指定的符合標準的新預處理器產生。
關閉警告而不變更程序代碼
您可以使用 warning pragma 來#pragma warning(suppress : 5105)
關閉特定程式代碼行的警告。 您也可以使用 warning pragma , #pragma warning(disable : 5105)
關閉檔案內的警告。 您可以使用 /wd5105 命令行選項,在命令行組建中全域關閉警告。
若要關閉 Visual Studio IDE 整個專案的警告:
- 開啟專案的 [屬性頁] 對話。 如需如何使用 [屬性頁] 對話框的資訊,請參閱屬性頁 (部分機器翻譯)。
- 選取 [組態屬性>C/C++][>進階] 頁面。
- 編輯 [停用特定警告] 屬性以新增
5105
。 選擇 [確定] 以套用變更。
範例
此範例程式示範如何產生警告 C5105,以及如何修正它。
// C5105.cpp
// To demonstrate the warning,
// compile by using: cl /EHsc /experimental:preprocessor /DTEST C5105.cpp
// To fix the warning, change the DEFINED_TEST
// definition to the commented version.
#include <iostream>
#define DEFINED_TEST defined TEST
//#if defined TEST
//#define DEFINED_TEST 1
//#else
//#define DEFINED_TEST 0
//#endif
int main()
{
#if DEFINED_TEST // C5105
std::cout << "TEST defined\n";
#else
std::cout << "TEST not defined\n";
#endif
}