所以我试图从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);
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个关于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);
Run Code Online (Sandbox Code Playgroud)
让它工作.那太难看了; 有没有更好的方法来解决这个问题?也许我应该存储它的定义max并在之后重新定义它?
小智 59
只需将函数名称括在括号中:
(std::numeric_limits<size_type>::max)()
Run Code Online (Sandbox Code Playgroud)
在这种情况下不需要NOMINMAX宏,另外你不会收到编译器警告
如果你不知道别人可能不包括windows.h没有NOMINMAX,你可以定义一个虚拟的宏可以用来抑制函数宏调用不改变的定义:
#define DUMMY
...
std::numeric_limits<std::streamsize>::max DUMMY ()
Run Code Online (Sandbox Code Playgroud)
也不是很漂亮,但是有效并且是非侵入性的.
使用Windows头文件时,我更喜欢通过将其包含在专门的代码和头文件中(如果需要,使用pimpl)来尽可能地隐藏它,因为它会向全局命名空间抛出太多垃圾.
如果您碰巧使用 GDI+,则该方法NOMINMAX对您不起作用,因为 GDI+ 的标头需要min或max在全局命名空间中。
在这种情况下,最简单的解决方法是取消定义min/max不再需要时。
用于说明该方法的代码示例:
//#define NOMINMAX - this won't work
#include <Windows.h>
#include <gdiplus.h>
#undef max
#undef min
...
#include <cxxopts.hpp>
Run Code Online (Sandbox Code Playgroud)