Найдите #define, который нарушает компиляцию - PullRequest
2 голосов
/ 29 октября 2011

У меня возникла ситуация, когда #define в одном из заголовочных файлов нарушает объявление enum в другом заголовочном файле.

Используя -E включите gcc Я установил, что у меня

#define OFF 0

где-то.

Вопрос в том, как мне узнать где? Проект огромен, десятки подключаемых каталогов, сотни включаемых файлов. В конце концов я сделаю глобальный grep, но вопрос в том, есть ли способ спросить компилятор gcc, где происходит #define? Это, очевидно, имеет эту информацию!

Обновление: спасибо не за одно, а за два решения - ТАК приходит. Для справки, виновником была одна из библиотек клиента Sybase (ctlib, даже не dblib). Уч.

Ответы [ 3 ]

15 голосов
/ 29 октября 2011

Вы можете переопределить его (к другому значению). Затем gcc сообщит вам, где он уже определен.

В моей системе это выглядит так:

В файле из : 27,

             from < another file >:13: 

<файл заголовка с переопределенным значением>: 30: 1:> предупреждение: «<определение>» переопределено

<командная строка>: предупреждение: это местоположение предыдущего определение

5 голосов
/ 29 октября 2011

Используйте опцию -dD вместе с -E. Если включены оба, вы видите результат предварительной обработки, включая определения. Просто найдите свой макрос (например, #define OFF 1) и прокрутите вверх до # number filename, и вы найдете последний включаемый файл, поэтому именно он определил ваш макрос.

2 голосов
/ 29 октября 2011

Хорошее решение - запустить что-то вроде «ctags», которое, по сути, создает базу данных символов, определенных в вашем коде.Многие популярные редакторы (vim, emacs) будут читать файл тегов и позволят вам быстро перейти к определениям по имени.Например, используя vim, я просто набрал бы:

:ta myfunction

Чтобы найти определение myfunction.Это работает одинаково хорошо для макросов, созданных с #define, и поддерживает различные языки, кроме C. Я использую exhuberant ctags , что вы получите, если вы установите ctags на RHELсистема, но она, безусловно, доступна в Debian, Ubuntu, OS X и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...