Страницы

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

понедельник, 8 октября 2018 г.

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

Почему данный код не работает?
#include #include
int main() { min(1, 2); std::numeric_limits::max(); }
А данный работает?
#include #include
int main() { min(1, 2); (std::numeric_limits::max)(); }
Интересует больше второй пример. Что с точки зрения языка это означает?


Ответ

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

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

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