Есть ли инструмент, чтобы держать мои исходные файлы C в порядке? - PullRequest
6 голосов
/ 31 июля 2010

У меня есть несколько исходных файлов C, которые медленно расширяются. Я стараюсь держать прототипы с документацией в файле .h в хорошем порядке, сгруппированные по соответствующим функциям и типам с помощью #pragma mark. Код написан и задокументирован таким образом, что требуется прочитать файл .h вместе с файлом .c. Я бы хотел, чтобы файлы были упорядочены таким образом, чтобы это облегчалось.

Есть ли способ сохранить объявления функций в файле .c в том же порядке, что и их прототипы в файле .h? Я ищу инструмент для чтения файла .h#pragma mark s, если возможно) и переупорядочения файла .c соответственно.

возможно?

Ответы [ 3 ]

1 голос
/ 07 августа 2010
  • Используйте хорошую IDE ... Нет необходимости поддерживать порядок в заголовочном файле / c файле.

  • Если вас это не устраивает ... Сохраните все декларации и определения в Алфавитный порядок. Когда вы добавляете новую функцию, вы знаете, куда вставить новая функция.

    P.S. Я верю в http://www.dmoz.org/ высказывание ::

      Humans Do it better
    
1 голос
/ 09 августа 2010

Я сомневаюсь, что вы найдете такой инструмент в продаже. Итак, вам нужен специальный инструмент. Ты не хочу попробовать сделать это с помощью некоторого метода взлома строк (например, Perl), потому что детали точно Парсинг C и C ++ намного превосходит то, что вы можете надежно сделать таким образом. Если ты не возражаешь Взлом строк, иногда повреждающий ваши файлы, может быть, вы можете обойтись без этого.

Моя компания DMS Software Reengineering Toolkit может быть использована для этого надежно по модулю предостережения.

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

Предупреждение касается синтаксического анализа исходного кода, содержащего директивы препроцессора: они должны быть хорошо структурированы [например, #ifdef #endif должен вкладываться в другие операторы, как обычные если и т. д. в отличие от использования через границу оператора. Это происходит в коде C; много меньше в коде C ++. Наш опыт показывает, что если вы хотите немного изменить свой код на C, Вы можете решить эту конкретную проблему.

Для вашей конкретной задачи вы делаете в значительной степени ответ, описанный для Scientific Toolworks:

  1. Выберите единицу компиляции и проанализируйте ее с помощью DMS. Вы должны предоставить все ту же информацию Вы предоставляете компилятор, чтобы он мог найти заголовочные файлы и т. д.
  2. DMS создает AST как для вашего модуля компиляции, так и для всех заголовочных файлов.
  3. Пройдите AST, чтобы извлечь порядок объявлений в заголовках и модуле компиляции.
  4. Реструктурировать дерево модулей компиляции в соответствии с порядком, полученным из 3)
  5. Prettyprint полученный модуль компиляции AST

[Причина, по которой это делается с помощью DMS, а не Scientific Toolworks, заключается в том, что DMS предназначена для анализировать / преобразовывать / восстанавливать код, тогда как SciTool IMHO действительно предназначен только для анализа и проанализировать. DMS предоставляет доступ к мелким деталям, необходимым для преобразования, которое SciTools нет, по крайней мере, не в последний раз, когда я смотрел].

Осложнения будут возникать из-за условных выражений, макросов, пространств имен, ... но вы должны будете решить политику для разрешения. Например, если заголовочный файл имеет #if ... #else .... #endif и объявления в предложении then другой порядок, чем в предложении else, каков желаемый порядок? Что если определение функции создается макросом в заголовке? Но все это то, что делает строим настоящий инструмент, э-э, весело.

Мое личное мнение таково, что это довольно большая работа для эффекта, который вы получаете. если ты делать все это, насколько лучше будет ваш процесс разработки программного обеспечения? Мы обычно используем DMS проверить на наличие ошибок кодирования или изменить код так, как это делают люди (например, вставить инструментарий во время выполнения) временно или AOP-подобный совет), где ясно, что механический двигатель имеет выгоду.

1 голос
/ 07 августа 2010

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

Компания под названием SciTools поставляет анализатор исходного кода под названием 'понимаю 4 с ++', который имеет C API, который делает это довольно легко. Но вам, вероятно, придется написать инструмент самостоятельно. На самом деле я написал управляемый API, который находится поверх их C API. Мой управляемый находится на codeplex здесь: http://understandapi.codeplex.com/

Вот как я бы структурировал программу.

  1. Сначала вы должны создать базу данных всего вашего исходного кода. Вы можете сделать это с помощью пакетного сценария, если хотите, или сценария powershell, или вы можете сделать это вручную самостоятельно. Обычно это так же просто, как указывать на каталог и фактически сказать «создайте базу данных всех файлов в нем». Вы можете определить, хотите ли вы файлы * .c, * .h или * .cpp в вашей базе данных.

  2. Затем с помощью API вы можете просматривать все файлы с расширением .h.

  3. Для каждого заголовочного файла вы проверяете, есть ли соответствующий файл .c. Это делается путем взятия строки имени файла, замены расширения файла (.NET делает это легко) и проверки, существует ли файл. Если он существует, переходите к следующему шагу.

  4. Затем программа должна выполнить итерацию по всем определенным объектам в файле .h.

  5. Затем для каждой сущности она находит ссылку на свое определение (не объявление) и проверяет, существует ли она в соответствующем файле .c. Если он есть, он находит номера строк определения кода, открывает файл для чтения, читает необходимые строки кода (и комментарии тоже) и записывает их во временный файл.

  6. После завершения перезаписать файл .c временным файлом.

  7. Перейдите к остальным файлам в базе данных.

Теперь это не так просто. По пути вы можете столкнуться с неприятностями в виде: 1. Условно скомпилированный код, в этом случае его будет сложнее анализировать, хотя это возможно. Понимание 4 C ++ анализирует директивы условной компиляции и различает неактивный и активный код. Но просто справиться с этим было бы очень сложно. 2. Пространства имен - это усложнит ситуацию.

Однако, если вас интересует только организация кода между определенными директивами #pragma, это может снова упростить ситуацию.

Дайте мне знать, если вы заинтересованы больше, и мы поговорим в автономном режиме.

...