2017-01-10 1 views
0

Как я могу сохранить препроцессор в выходном файле с определенным именем как x или y?Препроцессор GCC с -E и сохранить в файле с именем x

Я попробовал командную строку:

gcc -E -o pgcd.c x.o 

Но это, похоже, не является решением.

ps: файл не существует перед компиляцией, я бы просто сохранил препроцессор в файле с именем, которое я определил.

Благодарим за помощь.

+2

'НКУ -E pgcd.c -o x.o'? –

+0

На первый взгляд, 'gcc', возможно, проигнорировал файл' x.o' (а не исходный файл C), милостиво сохраняя исходный файл 'pgcd.c' из-за стирания. (У вас есть резервная копия в вашей системе контроля версий VCS?). Параметр '-o' принимает аргумент имени файла, который перезаписывается выходом из того, что он делает. Будь осторожен! –

+0

Я пробовал {gcc -E pgcd.c -o x} без расширения .o, как вы думаете, это работает, потому что был создан x-файл, поэтому pgcd.c не должен был быть перезаписан? –

ответ

0
gcc -E file.c 

будет предобработки file.c и написать препроцессированный исходный код на стандартный вывод (консоль). Таким образом, чтобы сохранить препроцессированный выход, перенаправлять стандартный вывод в файл по вашему выбору:

gcc -E file.c > somefile 

Это плохая идея для неких-файла, чтобы иметь .o расширения. GCC и другие инструменты интерпретируют расширение .o как означающее, что файл содержит объект код, в качестве вывода путем компиляции. Предварительная обработка file.c не производит код объекта . Он просто создает предварительно обработанный исходный код, который позже можно скомпилировать.

Обычное расширение файла для предварительно обработанного исходного кода C: .i (.ii для предварительно обработанного исходного кода на C++). Поэтому

gcc -E file.c > file.i 

является подходящим выбором.

Вы обнаружите, что file.i содержит препроцессорные линейные маркеры, например.

# 1 "file.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "file.c" 
# 1 "/usr/include/stdio.h" 1 3 4 
# 27 "/usr/include/stdio.h" 3 4 
... 
... 

Если вы не хотите, чтобы эти линии-маркеры появляются на выходе, добавьте параметр -P :

gcc -E -P file.c > file.i 
+0

спасибо, что вы значимый ответ! Если я не использую расширение .i, какая разница? –

+0

Не будет никакой разницы в выходе, но, как я уже сказал, использование расширения '.o' будет вводить в заблуждение людей и инструменты, особенно. компиляторах и компоновщиках, полагая, что файл является файлом объектно-кодового кода. –

+0

@ChrysBltr Я бы добавил, что сам GCC распознает файл '.i' как предварительно обработанный код C и скомпилирует такой входной файл как C без специального приглашения, пропустив ненужную фазу предварительной обработки. –