Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

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

#cpp #windows


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

#include 
#include 

int main()
{
    min(1, 2);
    std::numeric_limits::max();
}


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

#include 
#include 

int main()
{
    min(1, 2);
    (std::numeric_limits::max)();
}


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


Ответы

Ответ 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 */ в Майкрософте проблему знают, но трогать не будут:).

Комментариев нет:

Отправить комментарий