Типичный C с рефакторингом препроцессора C - PullRequest
2 голосов
/ 25 апреля 2009

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

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

спасибо

Ответы [ 7 ]

3 голосов
/ 10 марта 2010

Любой, кто интересуется этим (специфично для C), может захотеть взглянуть на инструмент coccinelle :

Coccinelle - это механизм сопоставления и преобразования программ, который предоставляет язык SmPL (Semantic Patch Language) для указания желаемых совпадений и преобразований в C-коде. Coccinelle изначально была нацелена на выполнение побочных эволюций в Linux. Такие эволюции содержат изменения, которые необходимы в клиентском коде в ответ на эволюции библиотечных API, и могут включать в себя такие модификации, как переименование функции, добавление аргумента функции, значение которой так или иначе зависит от контекста, и реорганизация структуры данных. Помимо побочной эволюции, Coccinelle успешно используется (нами и другими) для поиска и исправления ошибок в системном коде.

2 голосов
/ 25 апреля 2009

Ну, так как это часть препроцессора ... # Включение рефакторинга - огромная огромная тема, и я не знаю ни одного инструмента, который бы делал это действительно хорошо.

Тривиальные проблемы, с которыми может справиться инструмент:

  • Обеспечение согласованного использования регистра и обратной косой черты в # включает
  • Принять согласованное соглашение о защите заголовков, автоматически добавлять избыточные внешние средства защиты и т. Д.

Более сложные проблемы, с которыми может справиться инструмент:

  • Поиск и удаление ложных включений.
  • Предложите использовать предикларации везде, где это возможно.

Для макросов ... возможно, было бы интересно найти какую-то область видимости, где, если вы # определите макрос внутри блока, инструмент автоматически #undef определит его в конце блока. Другие быстрые вещи, о которых я могу думать:

  • Может быть полезен быстрый анализ безопасности макросов, так как многие люди до сих пор не знают, как использовать do {} while (0) и другие методы.
  • Кроме того, найдите и пометьте места, где выражения с побочными эффектами передаются в качестве аргументов макроса. Это может быть очень полезно для таких вещей, как ... заявления с непреднамеренными побочными эффектами.
2 голосов
/ 25 апреля 2009

Огромная тема!

  • То, что мне нужно очистить, это искаженные гнезда #ifdefs. Инструмент рефакторинга будет понимать, когда условные вещи появляются в списках аргументов (объявление функции или определения), и улучшать это.

  • Если бы это было действительно хорошо, он признал бы, что

    #if defined(SysA) || defined(SysB) || ... || defined(SysJ)
    

    было действительно эквивалентно:

    #if !defined(SysK) && !defined(SysL)
    

    Если бы тебе это удалось, я бы удивился.

  • Это позволило бы мне указать «этот макрос теперь определен - какой код видим» (то есть, видимый для компилятора); это также позволило бы мне выбрать, чтобы увидеть код, который невидим.

  • Он будет обрабатывать систему, распределенную по более чем 100 каталогам верхнего уровня, с различными уровнями подкаталогов под ними. Он будет обрабатывать десятки тысяч файлов с длиной строк по 20 КБ

  • Он будет определять, откуда идут определения макросов из make-файлов, а не заголовочных файлов (аааа!).

1 голос
/ 25 апреля 2009

Макросы часто могут быть довольно сложными, поэтому я бы не стал поддерживать намного больше, чем простое переименование.

0 голосов
/ 17 июня 2018

Только что обнаружил этот старый вопрос, но я хотел упомянуть, что я спас бесплатную версию Xrefactory для C, которая теперь называется c-xrefactory, которой удается выполнить некоторые рефакторинги в макросах, такие как переименование. макрос, переименовать параметр макроса.

0 голосов
/ 25 апреля 2009

Если вы можете справиться с надежным переименованием различных типов, переменных и макросов в большом проекте со сколь угодно сложной иерархией каталогов, я хочу использовать ваш продукт.

0 голосов
/ 25 апреля 2009

Я честно скажу вам, что нет хороших инструментов для рефакторинга C ++, как для Java. Большая часть будет болезненным поиском и заменой, но это зависит от конкретной задачи. Посмотрите на плагины Netbeans и Eclipse C ++.

Я видел, например, что Xref мог не рефакторинг макросов, которые используются как итераторы (не знаю точно, что это значит, хотя)

Если честно, возможно, вы слишком надуманы - подумайте, подходит ли вам человек для этой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...