Согласно руководству 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-е-значит