Рекурсивно удалить макросы препроцессора

У меня есть исходное дерево для программы, над которой я работаю, написанной в смешанном коде C/C++. В целях отладки я хотел бы иметь возможность запускать инструмент командной строки, например unifdef, для всего дерева (рекурсивно), чтобы удалить определенный набор макросов #ifdef/#endif из всех исходных файлов.

Мне было интересно, есть ли какой-то конкретный способ сделать это эффективным способом. Любая помощь будет оценена, спасибо.


person beeselmane    schedule 07.05.2017    source источник
comment
Вам нужно сделать это на C или C++, или вам нужно написать сценарий оболочки, который делает это?   -  person Barmar    schedule 07.05.2017
comment
Используйте команду find с параметром -exec, чтобы выполнить команду для всех файлов в исходном дереве.   -  person Barmar    schedule 07.05.2017
comment
Смешанного кода C/C++ не существует. Один исходный файл может быть только на языке C или C++. Компилятор C++ не может компилировать код C.   -  person too honest for this site    schedule 07.05.2017
comment
@Olaf Я думаю, он имеет в виду, что в его проекте есть исходные файлы C и C ++.   -  person Barmar    schedule 07.05.2017
comment
Не понятно. Код внутри директивы #ifdef будет скомпилирован, если символ определен. Почему вы не можете просто определить (или отменить определение) символ из скрипта makefile/build?   -  person kebs    schedule 07.05.2017
comment
@Barmar: Кто знает? Многие люди думают, что стиль программирования C это C.   -  person too honest for this site    schedule 07.05.2017
comment
@Olaf Компилятор С++ не может скомпилировать код C. Э??? Вы имели в виду наоборот?   -  person DYZ    schedule 07.05.2017
comment
@DYZ: Нет. Это разные языки! Почитайте стандарты. Идентичный синтаксис/грамматика не означает идентичную семантику. Прочтите мои комментарии внимательно еще раз!   -  person too honest for this site    schedule 07.05.2017
comment
@Olaf Конечно, я могу скомпилировать почти любой код C с помощью компилятора C++. Есть операторы C, которые имеют семантику, отличную от их двойников C++, но ваше утверждение слишком сильное, чтобы быть правдой.   -  person DYZ    schedule 07.05.2017
comment
У них почти идентичный препроцессор. У меня есть исходные файлы C и C++, которые совместно используют макросы. Конечно, вы не можете скомпилировать C++ с помощью компилятора C (хотя, как правило, обратное работает правильно). Я не пытаюсь ничего компилировать, просто удаляю неиспользуемые макросы.   -  person beeselmane    schedule 07.05.2017
comment
@DYZ: Попробуйте эти простые определения: static const int i = 10; static int a[i] = { 0 };. Вы также хотите узнать о искажении имен. Как вы думаете, почему нужно использовать extern "C" в C++ для объявлений функций C? Достаточно хорошо выучить оба языка. Похоже, вы не поняли, что я написал: если вы используете стиль кодирования C в C++, это не делает вашу программу C-совместимой!   -  person too honest for this site    schedule 07.05.2017
comment
@Olaf У меня есть несколько исходных файлов. Есть несколько файлов с кодом C++ и несколько файлов, содержащих код C. На самом деле это даже не имеет значения, потому что я говорю о препроцессоре C, а не о самом коде. (Кроме того, единственная причина, по которой вам нужно extern "C" в C++, заключается в искажении символов, оба по-прежнему компилируются в сборку практически одинаковым образом.   -  person beeselmane    schedule 07.05.2017
comment
@DYZ: Очевидно, лучше тебя! Обратите внимание, что два приведенных выше определения прекрасно компилируются в C++, хотя каждое из них само по себе допустимо для обоих языков. Семантика имеет значение.   -  person too honest for this site    schedule 07.05.2017
comment
Кажется, вы хотите удалить некоторые #ifdef и соответствующий оператор #endif, чтобы код между директивами теперь компилировался безоговорочно. Как вы собираетесь относиться к #else и #ifndef?   -  person M Oehm    schedule 07.05.2017
comment
@M Oehm Не совсем — я хочу удалить код между ними, если он не будет скомпилирован нормально, и оставить код, если он будет скомпилирован нормально. Я в основном просто хочу оценить блоки, как это сделал бы препроцессор. Я хочу иметь возможность предоставить макросы, которые я хочу определить, а затем будут вычислены изменения.   -  person beeselmane    schedule 07.05.2017
comment
@beeselmane Большинство компиляторов имеют возможность сохранять вывод препроцессора в файл. Поэтому скомпилируйте свой код с этой опцией.   -  person Barmar    schedule 07.05.2017


Ответы (1)


Я решил эту проблему с помощью следующей команды:

find . -name '*.c' -o -name '*.h' -o -name '*.cpp' -o -name '*.hpp' -exec unifdef <macro definitions> -o '{} {} ;'

person beeselmane    schedule 07.05.2017