Ответ 1
gcc по умолчанию полностью не соответствует стандарту C.
Вызвать его с помощью -ansi
, -std=c99
или -std=c1x
и unix
не будет предопределено. (-std=c1x
, вероятно, станет стал -std=c11
в <предыдущем выпуске gcc-версии будущего.)
Немного запутанно, что это описано в отдельном руководстве для препроцессора GNU, а не в руководстве gcc.
Указание документации по препроцессору GNU (info cpp
, версия 4.5):
Стандарт C требует, чтобы все системные макросы были частью "зарезервированное пространство имен". Все имена, начинающиеся с двух символов подчеркивания, или подчеркивание и заглавная буква, зарезервированы для компилятора и библиотеки для использования по своему усмотрению. Однако исторически Макросы, специфичные для системы, имеют имена без специального префикса; для Например, обычно можно найти `unix ', определенный в Unix-системах. Для все такие макросы, GCC предоставляет параллельный макрос с двумя символами подчеркивания добавлен в начале и в конце. Если `unix 'определен, `__unix__ 'также будет определен. Не будет больше двух подчеркивает; Параметр `_mips '-` __mips __'.
Когда опция `-ansi 'или любая опция` -std', которая запрашивает строгую соответствие, предоставляется компилятору, все системные предопределенные макросы вне зарезервированного пространства имен подавляются. параллельные макросы, внутри зарезервированного пространства имен, остаются заданными.
Мы постепенно отказываемся от всех предопределенных макросов, которые находятся за пределами зарезервированное пространство имен. Вы никогда не должны использовать их в новых программах, и мы попробуйте исправить старый код, чтобы использовать параллельные макросы когда вы его найдете. Мы не рекомендуем использовать системные макросы, которые также находятся в зарезервированном пространстве имен. Это лучше в в долгосрочной перспективе, чтобы специально проверить функции, которые вам нужны, используя инструмент таких как `autoconf '.
Текущая версия руководства здесь.