Есть ли способ «расширить» директиву #define? - PullRequest
3 голосов
/ 21 июня 2010

У меня много "глупых" #define в проекте, и я хочу их удалить. К сожалению, я не могу выполнить простой поиск и замену, поскольку #define параметризован. Например:

#define FHEADGRP( x ) bool _process_grp##x( grp_id_t , unsigned char )

Используется для генерации заголовков пары функций. Я хотел бы как-то сделать то же самое, что и препроцессор - заменить каждый вызов макроса его результатом (с вставленными правильными параметрами. Я надеюсь, вы понимаете, что я хочу сделать.

Я обнаружил, что в Visual Studio можно получить предварительно обработанные промежуточные файлы с параметром / P. К сожалению, это не помогает мне, так как файл «загрязнен» тысячами других строк и всеми расширениями #defines. Я не хочу этого делать, я просто хочу расширить некоторые макросы и, предпочтительно, сделать это в своей среде IDE (то есть Visual Studio). Есть ли способ, как этого добиться?

Ответы [ 3 ]

7 голосов
/ 21 июня 2010

Обычно вы можете получить выходные данные препроцессора с помощью gcc -E (при условии, что вы, конечно, используете gcc, хотя другие компиляторы, как правило, имеют такую ​​же функцию).Файл для автоматического расширения #define в другой текст не является тривиальной задачей.Я бы, вероятно, написал сценарий оболочки (или Perl, поскольку, на мой взгляд, он намного лучше массирует текст) для автоматизации задачи.


В Visual Studio вы можете использовать /P длята же операция.Это может быть установлено в IDE согласно этой странице .

3 голосов
/ 21 июня 2010

Да, есть, поскольку вы используете Visual Studio.

В Visual Studio IDE имеется мощный механизм поиска и замены. Вы, кажется, предполагаете, что он может обрабатывать только литеральные строки. Это может сделать больше. Нажмите Ctrl - Shift - H для глобального поиска и замены. В разделе «Параметры поиска» выберите «Использование: Подстановочные знаки».

Теперь замените FHEADGRP(*) на bool _process_grp\1( grp_id_t , unsigned char )

Подстановочный знак - *, а \1 - обратная ссылка.

[править] Макросы работают на токенизированном источнике, но поиск и замена работают на символах. Это может вызвать небольшую проблему. Рассмотрим случаи FHEADGRP(Foo) и FHEADGRP( Foo ). Для макроса C они эквивалентны, но во втором случае обратная ссылка расширится до Foo - с пробелами.

Обходной путь должен использовать регулярные выражения, в частности заменить FHEADGRP\(:b*(.*):b*\) на bool _process_grp\0( grp_id_t , unsigned char ). Я считаю, что реализация VS2005 немного глючит; например, простое выражение ? не соответствует одному пробелу. Но приведенный выше пример должен работать.

0 голосов
/ 21 июня 2010

Э-э, я бы посоветовал вам использовать sed, http://www.gnu.org/software/sed/, или другой инструмент регулярных выражений.

...