Как я могу заставить компилятор сказать мне, какой файл #define значение? - PullRequest
3 голосов
/ 24 июня 2010

Мой код связан с несколькими другими библиотеками, которые также разрабатываются в моей компании, одна из этих библиотек переопределяет несколько значений из errno.h, я хотел бы исправить это, однако мне трудно найти точнуюфайл, который переопределяет эти значения, я хочу знать, есть ли способ заставить компилятор сообщать мне, когда файл определил определенное значение.

Ответы [ 6 ]

5 голосов
/ 24 июня 2010

Скорее всего, вы можете сделать это, добавив -include errno.h в командную строку, которая собирает соответствующую библиотеку.Вот быстрый пример.У меня есть программа на языке C с именем "file.c":

#define ESRCH 8

Вот и все - тогда я скомпилирую с:

cc -c -include errno.h file.c

И до, предупреждение компилятора:

file.c:1:1: warning: "ESRCH" redefined
In file included from /usr/include/errno.h:23,
                 from <command-line>:0:
/usr/include/sys/errno.h:84:1: warning: this is the location of the previous definition

Это скажет вам, где ваши плохие определения.

3 голосов
/ 24 июня 2010

Вы пытались искать с grep?

2 голосов
/ 25 июня 2010

С GCC я сделал что-то похожее с:

g++ input.cc -dD -E > cpp.out

-dD говорит cpp напечатать все определения, где они были определены. А в выводе cpp есть также маркеры для имен включаемых файлов и номеров строк.

2 голосов
/ 24 июня 2010

Если вы не хотите искать во всех своих заголовках определенный #define, вы можете использовать

#undef YOUR_MANIFEST_CONSTANT

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

Кроме того, ваш компилятор может сказать вам, что #define был переопределен.Включите все свои предупреждения.

0 голосов
/ 25 июня 2010

Некоторые IDE перейдут в правильное местоположение, если вы щелкнете правой кнопкой мыши по использованию и выберете «перейти к определению».

Другой вариант, если вы действительно застряли, - это опция командной строки компилятора.Большинство компиляторов имеют возможность выводить ассемблер, который они генерируют при компиляции кода C ++.Вы можете просмотреть этот ассемблер (в котором есть комментарии, указывающие на относительный номер строки в исходном файле C ++).Вам не нужно понимать ассемблер, но вы можете увидеть, какое значение использовалось и какие файлы и определения были включены при запуске компилятора.Проверьте документацию вашего компилятора для точного варианта использования

0 голосов
/ 24 июня 2010

Возможно, что в некоторых средах, я думаю, IDE здесь, параметры конфигурации связаны с «настройками проекта», а не с помощью заголовка конфигурации.Если вы работаете со многими другими разработчиками в местах, где это поведение НЕ осуждается, вы можете также проверить настройки своего инструмента.

Большинство компиляторов скажут вам, в чем проблема, вы должны посмотреть и подуматьо том, что диагностическое уведомление говорит вам.Если не считать этого, grep / findstr на * nix / Windows - ваш друг.Если это ничего не дает, проверьте настройки инструмента в вашей системе сборки.

...