Подтвердить что ты не робот

Как я могу справиться с максимальным макросом в windows.h, столкнувшись с max в std?

Итак, я пытался получить действительный целочисленный ввод из 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 и переопределять его после?

4b9b3361

Ответ 1

Определите макрос NOMINMAX:

Это приведет к подавлению минимальных и максимальных определений в Windef.h.

Ответ 2

Просто скопируйте имя функции в скобки:

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

В этом случае нет необходимости в макросе NOMINMAX, плюс вы не получите предупреждения компилятора

Ответ 3

Вы просто пытаетесь очистить буфер cin? Я всегда использовал:

cin.ignore(cin.rdbuf()->in_avail());

Ответ 4

Если вы не знаете, включил ли кто-то другой windows.h без NOMINMAX, вы могли бы определить фиктивный макрос, который можно использовать для подавления макрокоманд, подобных функциям, без изменения определения:

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

Не очень симпатичный, но работает и не навязчив.

При работе с заголовочным файлом Windows я предпочитаю скрыть это как можно больше, включив его только в специализированные файлы кода и заголовка (используя, при необходимости, pimpl), потому что он выдает слишком много мусора в глобальное пространство имен.

Ответ 5

Если вы используете 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>