2012-01-05 4 views
1

У меня есть некоторые источники C, для которых я хочу развернуть #define макросы (и #ifdefs и т. Д.), Но НЕ #includes. #includes следует оставить нетронутым.Избегайте предварительной обработки #includes

Возможно ли использование препроцессора cpp (C)?

+1

Включены ли входящие файлы в значения определенных параметров? – thiton

+0

Нет, просто stdio.h –

ответ

2

Нет, это не так, поскольку #include является инструкцией препроцессора.

Единственная возможность, которую у вас есть, - запустить cpp на файлы после удаления #include.

Если у вас есть оболочка Unix с GNU Grep, это может быть сделано, например, с:

grep -Pv '^\s*#\s*include\b' thefile.c|cpp 
1

Если включенных файлов выглядит следующим образом:

inc_file1.h 

#if !defined(INC_FILE1_H) 
#define INC_FILE1_H 

/// some code 

#endif 

, то вы можете определить INC_FILE1_H самостоятельно вызывая inc_file1.h внутри деклараций, которые не обрабатываются

2

Нет прямого способа. Поэтому я пробовал следующую программу и работает для большей части файлов .c tha У меня есть. Я взял @fge grep и добавил еще код вместе с gcc -E .. Надеюсь, это поможет!

#!/bin/bash 

if [[ $# -ne 1 || ! -f $1 ]] ; then 
    echo "Invalid args/Check file " 
    exit 
fi 

file_name=$1 

grep '^\s*#\s*include' $file_name > /tmp/include.c 
grep -Pv '^\s*#\s*include\b' $file_name > /tmp/code.c 
gcc -E /tmp/code.c | grep -v ^# > /tmp/preprocessed.c 
cat /tmp/include.c > $file_name.done 
cat /tmp/preprocessed.c >> $file_name.done 
+0

спасибо, я попробую! –

+0

Это перемещает все включенные в начало файла, хотя, что не так, если ваш код содержит что-то вроде '#ifdef __GNUC__ \ n #include \ n #else \ n #include \ n #endif '. Я бы предпочел заменить '# include' на' FOOBARinclude', preprocess, а затем заменить FOOBAR на '#'. Для безопасности FOOBAR может быть длинной случайной строкой/GUID/независимо. –

+0

Да, это был очень примитивный сценарий. Но это может быть обновлено, чтобы соответствовать всем различным файлам 'c'. Ваша идея замены кажется хорошей! Дайте мне знать, как это происходит. –

1

Если у вас есть один исходный файл (или только некоторые из них), что вы можете сделать, это комментировать #include директивы, например:

#if 0 
#include "include1.h" 
#include "include2.h" 
#endif 

, а затем запустить препроцессор исходных файлов ,

+0

Еще лучше, прокомментируйте их с помощью '/ * ... * /' и используйте опцию '-C', после чего они не будут удалены из вывода препроцессора. – ams

1

Если у вас есть Emacs handy: c-macro-expand, связанный с C-c C-e может развернуть только отмеченный регион. Это также учитывает включенные в них, но ограничивает вывод команды в отмеченную секцию. Одна из лучших команд, если вы выполняете макропрограммирование.

Смежные вопросы