C++具有"min"成员的类的初始化列表

C++ initialization list for class with "min" member

本文关键字:初始化 列表 成员 具有 min C++      更新时间:2023-10-16

我见过一个类,其中有人将成员变量minmax命名为

class A
{
public:
 A();
 ~A();
 bool min;
 bool max;
 ...
};

带有构造函数

A::A()
{
  min=false;
  max=true;
  ...
}

我试着用一个初始化列表来重写它:

A::A():min(false), max(true){}

但我收到了警告+错误

warning C4003: not enough actual parameters for macro 'min'
error C2059: syntax error : ')'

因为min宏是在WinDef.h 中定义的

在这种情况下,是否可以在不重命名成员变量的情况下使用初始化列表?

如果您有VS2013或其他现代编译器:

A():min {false}, max {true} { }

避免了这个问题,因为min(a,b)是一个函数式宏,而{不能启动它的参数列表。

这是特定于初始值设定项列表的,所以我重新讨论了这个问题。建议的"重复"解决了表达式上下文中使用宏的问题,这从根本上不同——您可以在那里使用(min)

根据您的情况,您有几个选项。

  1. 按照@MSchanges 的建议使用大括号初始化

  2. 在包含windows头文件之前先定义NOMINMAX,以避免定义minmax宏。这将取决于你的代码有多大,以及你对它的控制程度

  3. #undef宏。仅在源文件中推荐。

  4. 使用MSVC预处理器指令保存、取消定义然后恢复宏。就像这样…

    #pragma push_macro("min")
    #undef min
    /* use min here */
    #pragma pop_macro("min")