編譯器警告 (層級 1) C5105
產生「已定義」的宏擴充具有未定義的行為
備註
預處理器偵測到 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
}