определить точный заголовочный файл - PullRequest
0 голосов
/ 21 октября 2009

Я использую некоторый макрос в моем исходном файле (* .c).

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

Проблема в том, что мы используем макрос #defined to 10 в некотором заголовочном файле, но значение, полученное в коде, равно 4. Таким образом, вместо того, чтобы проверять все файлы dep, мы хотим знать, что есть какой-то прямой способ определить источник, из которого был получен макрос.

Ответы [ 3 ]

7 голосов
/ 21 октября 2009

Если вы просто запустите cpp (препроцессор C) для файла, вывод будет содержать директивы #line вида

#line 45 "silly-file-with-macros.h"

для компилятора, говорящего, откуда все пришло. Так что одним из способов является использование

 cpp my-file.c | more

и найдите директиву #line.

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

test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition

(это из gcc), который должен сказать вам, где макрос был определен ранее. Но если подумать, как это, что вы уже не получаете это предупреждение?

Другая идея состоит в том, чтобы использовать makedepend, чтобы получить список всех включенных файлов, а затем выполнить grep для получения #define строк в них.

2 голосов
/ 21 октября 2009

grep для #define?

0 голосов
/ 21 октября 2009
find / -name '*.h' | xargs -L 100 grep -H macroname

Там есть три команды. Команда find выбирает, какие файлы нужно искать, чтобы вы могли изменить это значение на « .c» или « .cpp» или на все, что вам нужно. Затем команда xargs разбивает список файлов на 100 за раз, чтобы вы не переполнили некоторый размер внутреннего буфера команды оболочки. Затем команда grep запускается повторно с каждым списком из 100 файлов, и она печатает любые имена файлов, содержащие macroname и строку кода, которая его использует.

Отсюда вы сможете увидеть, где оно переопределяется.

...