77

所以我试图从 cin 获取有效的整数输入,并使用了这个问题的答案。

它建议:

#include <Windows.h> // includes WinDef.h which defines min() max()
#include <iostream>
using std::cin;
using std::cout;

void Foo()
{
    int delay = 0;
    do
    {
        if(cin.fail())
        {
            cin.clear();
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        cout << "Enter number of seconds between submissions: ";
    } while(!(cin >> delay) || delay == 0);
}

这在 Windows 上给了我一个错误,说max宏不接受那么多参数。这意味着我必须这样做

do
{
    if(cin.fail())
    {
        cin.clear();
#undef max
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    cout << "Enter number of seconds between submissions: ";
} while(!(cin >> delay) || delay == 0);

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

4

5 回答 5

115

定义宏NOMINMAX

这将抑制 Windef.h 中的最小和最大定义。

于 2012-07-18T14:49:08.300 回答
85

只需将函数名称括在括号中:

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

在这种情况下不需要 NOMINMAX 宏,而且您不会收到编译器警告

于 2015-04-20T08:24:52.110 回答
12

如果您不知道其他人是否可能windows.h不包含NOMINMAX,则可以定义一个虚拟宏,该宏可用于在不更改定义的情况下抑制类似函数的宏调用:

#define DUMMY
...
std::numeric_limits<std::streamsize>::max DUMMY ()

也不是很漂亮,但可以工作并且非侵入性。

在使用 Windows 头文件时,我更喜欢通过仅将其包含在专门的代码和头文件中(必要时使用 pimpl)来尽可能地隐藏它,因为它会将太多垃圾扔到全局命名空间中。

于 2012-07-18T21:48:17.030 回答
10

你只是想刷新 cin 缓冲区吗?我总是用:

cin.ignore(cin.rdbuf()->in_avail());
于 2012-07-18T14:51:12.950 回答
6

如果您碰巧使用 GDI+,则该方法NOMINMAX对您不起作用,因为 GDI+ 的标头需要minmax在全局命名空间中。

在这种情况下,最简单的解决方法是在不再需要min/时取消定义。max

说明该方法的代码示例:

//#define NOMINMAX - this won't work
#include <Windows.h>
#include <gdiplus.h>
#undef max
#undef min
...
#include <cxxopts.hpp>
于 2017-08-09T22:43:41.380 回答