Строки кода как функция определений препроцессора

#c #c-preprocessor #code-metrics

#c #c-препроцессор #код-метрики

Вопрос:

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

Мне интересно оценить, сколько строк кода различные конфигурации добавляют к моему основному проекту или вычитают из него. Другими словами, я хотел бы написать где-нибудь несколько строк #define и #undef и получить представление о том, что это делает с количеством LOC.

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

Существует ли существующий инструмент, который делал бы то, что я ищу, или какой-то простой способ сделать это самостоятельно? Исключение комментариев и пустых строк также было бы очень полезным.

Ответ №1:

Запустите его через препроцессор. Например, в gcc используйте опцию -E , я полагаю, чтобы получить именно тот вид вывода, который вам кажется нужным.

   -E  Stop after the preprocessing stage; do not run the compiler proper.
      The output is in the form of preprocessed source code, which is sent
      to the standard output.
  

Комментарии:

1. Круто! Я не знал, что смогу это сделать. Как говорит Джейсон, могут быть некоторые странные дополнения к препроцессору, но для меня это было бы хорошим простым началом.

Ответ №2:

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

Почему бы не написать свой собственный простой препроцессор и использовать свои собственные директивы include / exclude? Вы можете сделать их тривиально простыми для разбора, а затем передать свой код через этот препроцессор, прежде чем отправлять его в полнофункциональный счетчик LOC, такой как CLOC.