共用方式為


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

  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
}