Ответ 1
Определите макрос NOMINMAX
:
Это приведет к подавлению минимальных и максимальных определений в Windef.h.
Итак, я пытался получить действительный целочисленный ввод из cin и использовал ответ на этот question.
Рекомендуется:
#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
и переопределять его после?
Определите макрос NOMINMAX
:
Это приведет к подавлению минимальных и максимальных определений в Windef.h.
Просто скопируйте имя функции в скобки:
(std::numeric_limits<size_type>::max)()
В этом случае нет необходимости в макросе NOMINMAX, плюс вы не получите предупреждения компилятора
Вы просто пытаетесь очистить буфер cin? Я всегда использовал:
cin.ignore(cin.rdbuf()->in_avail());
Если вы не знаете, включил ли кто-то другой windows.h
без NOMINMAX
, вы могли бы определить фиктивный макрос, который можно использовать для подавления макрокоманд, подобных функциям, без изменения определения:
#define DUMMY
...
std::numeric_limits<std::streamsize>::max DUMMY ()
Не очень симпатичный, но работает и не навязчив.
При работе с заголовочным файлом Windows я предпочитаю скрыть это как можно больше, включив его только в специализированные файлы кода и заголовка (используя, при необходимости, pimpl), потому что он выдает слишком много мусора в глобальное пространство имен.
Если вы используете GDI +, подход с NOMINMAX
не будет работать для вас, потому что заголовки GDI + требуют min
или max
в глобальном пространстве имен.
И самое простое обходное решение в этом случае состоит в том, чтобы undefine min
/min
, когда они больше не нужны.
Пример кода для иллюстрации подхода:
//#define NOMINMAX - this won't work
#include <Windows.h>
#include <gdiplus.h>
#undef max
#undef min
...
#include <cxxopts.hpp>