Вопрос

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

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

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

Это было полезно?

Решение

Если вы просто запустите 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 , чтобы получить список всех включенных файлов, а затем использовать их для строк #define в них.

Другие советы

grep для #define?

find / -name '*.h' | xargs -L 100 grep -H macroname

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

Из этого вы сможете увидеть, где оно переопределяется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top