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