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