Что означает опция gcc -E?

Согласно руководству gcc, параметр -E только предварительно обрабатывает исходный файл .c, не запуская компилятор и просто предоставляя входной файл (.i). Но что означает -E?

Я не понимаю вопроса: как вы говорите, в руководстве говорится, что «опция -E только предварительно обрабатывает исходный файл .c, не запуская компилятор и просто предоставляя входной файл (.i)». Таким образом, эта опция означает «запустить препроцессор для файла .c и не продолжать компиляцию». См. также stackoverflow.com/questions/43193798/что-значит-gcc-е-значит

ForceBru 20.03.2022 17:27

@ForceBru OP спрашивает об этимологии. Обычно однобуквенные переключатели — это первые буквы того, что они делают.

HolyBlackCat 20.03.2022 17:38

@HolyBlackCat, а, ладно, логично

ForceBru 20.03.2022 17:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Резюме

  • Эта опция была введена в компиляторах намного раньше, чем GCC, и GCC использовала то же имя для совместимости.

  • Мое лучшее предположение из исторических свидетельств состоит в том, что -E означает «расширить макросы».

  • Авторы этих более ранних компиляторов не могли назвать это -P, потому что уже существовал вариант -P, который также запускал только препроцессор, но выводил вывод в .i файлы вместо стандартного вывода. -p тоже забрали.

  • Со временем -E стал предпочтительнее -P, и когда был написан GCC, он поддерживал только -E, а не -P.


Несмотря на то, что это предположительно не относится к теме переполнения стека, я думаю, что немного истории поможет объяснить, как эта опция получила свое название.

gcc(1) унаследовал свои основные параметры командной строки от гораздо более ранних компиляторов Unix C. Многие версии можно найти в архив дерева Unix.

Похоже, что первой версией, которая поддерживала -E, была Research Unix V7, около 1979 года: cc(1) источник, источник справочной страницы. Был еще вариант -P, который тоже просто запускал препроцессор, но отправлял результат в файл foo.i вместо стандартного вывода. V6 уже поддерживал -P, но не -E: cc(1) источник, источник справочной страницы.

Это, по крайней мере, объясняет, почему -E не был назван -P вместо этого: потому что -P уже использовался. (И -p также был взят, он использовался для запроса профилирования.) Единственный намек, который я нашел относительно того, почему был выбран -E, заключается в том, что соответствующая переменная флага в исходном коде называется exflag. Рискну предположить, что это означает «расширить», поскольку -E в основном расширяет макросы.

Похоже, что -P в конечном итоге устарело в пользу -E. V8 по-прежнему поддерживал его, но не упоминал на справочной странице. V10 (около 1989 г.) включал две версии компилятора: cc, который компилировал традиционный C, и lcc для ANSI C. На странице руководства говорится, что cc поддерживает -P с поведением препроцессора, но для lcc -P делал что-то еще ("записывал объявления для все определенные глобальные переменные при стандартной ошибке"). Они оба поддержали -E. На других фронтах 32V и BSD, по крайней мере изначально, поддерживали оба, но -P выдавал предупреждение о том, что он устарел и вместо него следует использовать -E.

Похоже gcc, от его самая ранняя версия, поддерживается только -E, а не -P. С тех пор была введена опция -P, но она делает что-то другое («запрещает генерацию маркеров линии»).

Другие вопросы по теме