Ответ 1
Любая библиотека C, которая определяет макрос с именем max
в своих стандартных заголовках, выходит за рамки воображения. К счастью, легкое обходное решение, если вам нужно поддерживать такие платформы, - это #undef max
(и любые другие проблемные макросы, которые он определяет) после включения заголовков системы и перед любыми вашими собственными заголовками/кодом.
Обратите внимание, что все остальные говорят о том, чтобы обернуть ваше определение в #ifndef max ... #endif
. Это не хорошая идея. Определение max
в системном заголовке - это указание на то, что разработчик был некомпетентен, и возможно, что определенные версии среды имеют неправильные макросы (например, те, которые неправильно защищают аргументы с круглыми скобками, но я даже видел Макрос max
, который неправильно выполнял min
вместо max
хотя бы один раз в жизни!). Просто используйте #undef
и будьте в безопасности.
Что касается того, почему это так нарушено для stdlib.h
для определения max
, стандарт C очень специфичен в отношении того, какие имена зарезервированы для приложения и какие имена зарезервированы для стандартных функций и/или внутреннего использования при реализации. Для этого есть веские причины. Определение имен макросов в заголовках систем, которые могут столкнуться с именами переменных/функций, используемых в прикладной программе, опасно. В лучшем случае это приводит к ошибкам компиляции с очевидной причиной, но в других случаях это может привести к очень странному поведению, которое трудно отлаживать. В любом случае очень трудно написать переносимый код, потому что вы никогда не знаете, какие имена будут уже приняты библиотекой.