共用方式為


編譯器警告 (層級 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 中整個專案的警告:

  1. 開啟專案的 [ 屬性頁] 對話方塊。 如需如何使用 [屬性頁] 對話方塊的資訊,請參閱 屬性頁
  2. 選取 [ 組態屬性 > C/C++ > 進階 ] 頁面。
  3. 編輯停用 特定警告 屬性以新增 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
}