编译器警告(等级 1)C5105

生成“已定义”的宏扩展具有未定义的行为

备注

预处理器在宏扩展的输出中检测到运算符 defined。 如果 defined 运算符显示为宏扩展的结果,C 标准将行为指定为未定义。 C5105 警告是可移植性和标准一致性警告,因为其他一致性编译器可能具有不同的行为。 若要解决此问题,请将 defined 运算符移出宏或禁止显示警告 C5105。

特定于 Microsoft 的行为:MSVC 编译器通常计算 defined 运算符,即使在 /permissive- 情况下也是如此。

此警告是 Visual Studio 2017 版本 15.8 中的新增功能。 它仅由 /experimental:preprocessor 编译器选项指定的符合标准的新预处理器生成。

在不更改代码的情况下关闭警告

可以使用警告杂注 #pragma warning(suppress : 5105) 关闭特定代码行的警告。 还可以使用警告杂注 #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
}