2016-11-30 18 views
3

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

Я хочу быстро определить, какие из этих макросов действительно используются, а какие нет (чтобы я мог удалить те, которые не являются). Меня не волнует, принимаются ли коды кода, которые их используют (например, if (1+1 == 3) { MY_MACRO(a,b,c); }.

Каков наилучший способ сделать это? Лучшее, что я мог придумать, это препроцесс . все с -Е и искать комментарии положения источника, которые упоминают макрос как-то

Примечания:

  • Если у вас есть решение, которое также перечисляет функции в использовании, что тоже отлично
  • . Я только вызываю определенные функции в код, который я вырезал из проекта. Если ваше решение может ограничить макросы, перечисленные в тех функциях, которые многие из них действительно вызывают из точек входа, это еще лучше.
  • Мой код компилируется и запускается (и если вы можете использовать его, вы можете принять вывод gprof)
  • Просто комментируя все макросы, хотя, очевидно, возможны, это хлопот; поэтому я хочу решение, которое не требует, чтобы я это делал.
  • Код, исключенный препроцессором, не используется; но если у вас есть решение, которое не соблюдает это ограничение, это все равно лучше, чем ничего.
  • Я не хочу "dump the list of preprocessor defines" - а скорее определяет , которые используются.
+4

Комментировать все директивы '# define' и перестроить. Проверьте, какие символы жалуются. –

+2

Sidenote: поскольку ваш код компилируется, не забудьте сравнить двоичные файлы до и после удаления макросов. Вы можете случайно удалить макрос, который используется в условной компиляции, и не получать никаких предупреждений или ошибок. – user694733

+0

@Someprogrammerdude: См. Редактирование. Я хочу быть более ленивым. – einpoklum

ответ

3

Существует clang инструмент под названием pp-trace. Он выводит каждый вызов препроцессора с его параметрами.

Вы заинтересованы в MacroExpands случае, это выглядит так, в pp-trace выход:

... 

- Callback: MacroExpands 
    MacroNameTok: X_IMPL 
    MacroDirective: MD_Define 
    Range: [(nonfile), (nonfile)] 
    Args: [a <plus> y, b] 

... 

Извлечение MacroNameTok из MacroExpands блока должен сделать трюк для вас.

+0

deniss, это доступно в clang-3.8? У меня возникли проблемы с размещением на моем дистрибутиве Kubuntu 16.04. – einpoklum

+0

@einpoklum, это должно быть. К сожалению, я только когда-либо создавал его из источников, поэтому не уверен, что он перераспределяется как двоичный. – deniss

+0

Ну, именно так вы знаете: [его нет в * buntu 16.04, и никто не знает почему.] (Http://askubuntu.com/posts/comments/1319419?noredirect=1). – einpoklum