2009-10-21 3 views
0

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

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

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

+1

Почему бы вам не запустить простой поиск или grep? – Naveen

ответ

7

Если вы просто запустите CPP (С препроцессора) на файл, то вывод будет содержать #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 

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

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

+0

Это правильный ответ. –

+0

Проблема с первой частью ответа заключается в том, что предварительная обработка файла удаляет все директивы '# define' и все экземпляры, в которых используется« MACRONAME »(это то, что делает препроцессор), поэтому ничего не осталось to grep for. Но трюк №2 довольно эффективен. –

+0

Вы правы, макрос исчезнет. Я должен был проверить это первым! – 2009-10-21 14:36:01

2

grep для #define?

+0

Проблема с этими файлами в grep. Если использовать «makedepend», можно получить полный список зависимостей, а затем передать это как аргумент grep. – 2009-10-21 14:20:18

+0

Все файлы в вашем проекте. Если его там нет, тогда вы переопределяете материал, который вам не следует касаться в первую очередь. – Marcin

+0

Разве это не проблема, отслеживание чего-то, что было переопределено, чего не должно было быть? – 2009-10-21 14:29:09

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

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

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

+0

нет, если он определен в системе, включает –

+0

Это не имеет смысла, поскольку вы просматриваете файлы, которые не могут быть включены в файл. – 2009-10-21 14:11:15