Согласно руководству gcc, параметр -E только предварительно обрабатывает исходный файл .c, не запуская компилятор и просто предоставляя входной файл (.i). Но что означает -E?
@ForceBru OP спрашивает об этимологии. Обычно однобуквенные переключатели — это первые буквы того, что они делают.
@HolyBlackCat, а, ладно, логично
Эта опция была введена в компиляторах намного раньше, чем 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
, но она делает что-то другое («запрещает генерацию маркеров линии»).
Я не понимаю вопроса: как вы говорите, в руководстве говорится, что «опция -E только предварительно обрабатывает исходный файл .c, не запуская компилятор и просто предоставляя входной файл (.i)». Таким образом, эта опция означает «запустить препроцессор для файла
.c
и не продолжать компиляцию». См. также stackoverflow.com/questions/43193798/что-значит-gcc-е-значит