Имя функции в скобках

447
19 августа 2017, 02:21

Почему данный код не работает?

#include <Windows.h>
#include <limits>
int main()
{
    min(1, 2);
    std::numeric_limits<int>::max();
}

А данный работает?

#include <Windows.h>
#include <limits>
int main()
{
    min(1, 2);
    (std::numeric_limits<int>::max)();
}

Интересует больше второй пример. Что с точки зрения языка это означает?

Answer 1

Проблема заключается в том, что некоторые специалисты придумали поместить в Windows.h два define для min и max. Но перед компиляцией всегда работает препроцессор. Он видит max (о namespace он ничего не знает) и пытается найти два аргумента у него. А их там нет... И ругается. Когда появляются скобки, парсер препроцессора не видит скобок () не пытается сделать подстановку. Код стает "ожидаемый".

Второй вариант исправить проблему - добавить в список define такой - NOMINMAX

Для любознательных. Внутри Windows.h есть такое

#ifndef NOMINMAX
#ifndef max
#define max(a,b)  (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b)  (((a) < (b)) ? (a) : (b))
#endif
#endif  /* NOMINMAX */ 

в Майкрософте проблему знают, но трогать не будут:).

READ ALSO
Как создать константу в .pro файле?

Как создать константу в .pro файле?

Лучше чтобы ее видно было во всем проекте, но в принципе можно чтобы она работала и только вpro файле Qt

300
Как правильно создавать набор с++

Как правильно создавать набор с++

Даны целые числа K, N и набор из N целых чиселЕсли в наборе имеются числа, меньшие K, то вывести TRUE; в противном случае вывести FALSE

335
Как заставить скрипт искать не по тексту, а по select?

Как заставить скрипт искать не по тексту, а по select?

Как заставить скрипт искать не по тексту, а по select?

353
Отслеживать время выполнения ajax

Отслеживать время выполнения ajax

Как отслеживать, сколько длится ajax запросЯсно, что есть timeout, но он устанавливает максимальное время выполнения

405