我该如何处理windows.h中的max宏与std中的max冲突的问题?

8 浏览
0 Comments

我该如何处理windows.h中的max宏与std中的max冲突的问题?

我试图从cin中获取一个有效的整数输入,并使用了这个问题的答案。\n它建议:\n

#include  // 包含WinDef.h,定义了min()和max()
#include 
using std::cin;
using std::cout;
void Foo()
{
    int delay = 0;
    do
    {
        if(cin.fail())
        {
            cin.clear();
            cin.ignore(std::numeric_limits::max(), '\n');
        }
        cout << "输入提交之间的秒数:";
    } while(!(cin >> delay) || delay == 0);
}

\n这在Windows上给了我一个错误,说`max`宏没有那么多参数。这意味着我必须这样做:\n

do
{
    if(cin.fail())
    {
        cin.clear();
#undef max
        cin.ignore(std::numeric_limits::max(), '\n');
    }
    cout << "输入提交之间的秒数:";
} while(!(cin >> delay) || delay == 0);

\n才能让它工作。这很丑陋;有没有更好的方法来解决这个问题?也许我应该存储`max`的定义,并在之后重新定义它?

0
0 Comments

问题出现的原因是windows.h中的max宏与std中的max发生冲突。解决方法是定义一个虚拟的宏DUMMY来避免函数式宏的调用。

以下是解决方法的代码示例:

#define DUMMY
...
std::numeric_limits::max DUMMY()

在使用Windows头文件时,最好尽可能将其隐藏起来,只在专门的代码和头文件中包含它(如果需要可以使用pimpl),因为它会向全局命名空间中添加很多垃圾。

以下是一些相关的建议:

- 尽可能地将windows.h分离出来。

- 当编写供他人使用的头文件时,无法控制用户是否在你的头文件之前包含了windows.h时,可以采用上述方法来解决冲突。

0
0 Comments

问题的原因是Windows.h头文件中的max宏与std命名空间中的max函数发生冲突。解决方法有以下几种:

1. 将函数名用括号括起来:

(std::numeric_limits<size_type>::max)()

。这样做可以避免使用NOMINMAX宏,并且不会出现编译器警告。

2. 使用std::max<size_type>(a,b)。这种方式更易读,并且模板参数可以阻止使用宏。但是需要注意,这种方式返回的是两个值中较大的那个,而不是size_type类型的最大值。

3. 在使用Windows头文件之前定义NOMINMAX宏。这是Clang/LLVM基础设施的建议,并且是较好的解决方法之一。

4. 如果项目中包含旧的代码(可能使用旧的max和min宏),则可以将NOMINMAX宏放在stdafx.h文件中。但需要注意,这可能会导致其他文件中出现错误。

总结起来,以上解决方法中,第一种方法的语法较为繁琐,但是在涉及其他库的情况下是最好的选择;第二种方法更易读,但是返回的是两个值中较大的那个;第三种方法是较好的解决方案,但需要在使用Windows头文件之前定义宏;第四种方法适用于包含旧代码的项目,但可能会导致其他文件中出现错误。

0
0 Comments

在Windows.h头文件中,存在一个名为“max”的宏定义,该宏定义会与std命名空间中的“max”函数发生冲突。这种冲突可能导致编译错误或意外的行为。为了解决这个问题,可以通过定义宏“NOMINMAX”来禁止Windows.h中的min和max定义。

宏NOMINMAX的定义如下所示:

#define NOMINMAX

在包含Windows.h头文件之前定义该宏,可以禁止Windows.h中的min和max定义。下面是一个示例代码:

#define NOMINMAX
#include 

通过这种方式,我们可以避免Windows.h中的max宏与std命名空间中的max函数发生冲突。

需要注意的是,有些编译器可能已经提供了对NOMINMAX的支持,因此不需要手动定义该宏。但是,为了确保代码的可移植性,建议在包含Windows.h之前定义NOMINMAX。

总结起来,为了解决Windows.h中的max宏与std命名空间中的max函数冲突的问题,可以通过定义宏NOMINMAX来禁止Windows.h中的min和max定义。

0