Как узнать (в GCC), когда данный символ макроса / препроцессора объявлен?

StackOverflow https://stackoverflow.com/questions/290952

  •  08-07-2019
  •  | 
  •  

Вопрос

Предположим, у меня есть #define foo в различных заголовочных файлах. Это может распространиться на некоторые разные вещи. Я хотел бы знать (при компиляции файла .cc), когда встречается #define, к чему он будет расширяться, к какому файлу и откуда он был добавлен.

Возможно ли это? Если нет, есть ли какие-то частичные решения, которые могут помочь?

Не стесняйтесь добавлять комментарии с просьбами о разъяснениях.

Изменить: текущие ответы, кажется, концентрируются на случае, когда есть один #define, и я просто хочу перейти к определению или узнать, что это за определение. Это простой случай, и да, ваши решения работают. Но когда у меня один и тот же #define в разных файлах, и я хочу знать, какой из них запускается первым, ни один из этих методов не будет полезен. Хорошо, я действительно осторожно использовал #warning, чтобы найти правильное место. Но это требует много работы.

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

Решение

Используйте -E:

# shows preprocessed source with cpp internals removed
g++ -E -P file.cc
# shows preprocessed source kept with macros and include directives 
g++ -E -dD -dI -P file.cc  

Внутренние элементы выше - это линейные маркеры для gcc, которые немного запутывают, когда вы читаете вывод. -P убирает их

 -E  Stop after the preprocessing stage; do not run the compiler proper.  
     The output is in the form of preprocessed source code, which is sent to the 
     standard output.

     Input files which don't require preprocessing are ignored.

Примечание: комментарии правильно жалуются, что это только частичное решение. Он не скажет вам, когда макрос будет заменен. Он показывает вам предварительно обработанный источник, который может быть полезен в любом случае.

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

  

Я хотел бы знать (при компиляции файла .cc), когда встречается #define,

Я знаю решение этой проблемы . Скомпилируйте файл с символом, уже определенным как недопустимый код C ++ (статья, на которую ссылается, использует '@'). Итак, для GCC вы должны написать

gcc my_file.c -Dfoo=@

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

Если вы используете трюк, предложенный Рэймондом Ченом, компилятор может сообщить вам, где находится " конфликтующий " пришло определение, и может дать вам список того, как оно было включено. Но нет гарантии. Поскольку я не использую макросы (я предпочитаю const и enum), я не могу сказать, является ли GCC одним из самых умных компиляторов в этом отношении. Я не верю, что стандарты C или C ++ говорят об этом, за исключением того, что после запуска препроцессора вы теряете всякую полезную информацию.

Это не поможет вам найти, где оно было определено, но вы можете увидеть определение для определенного файла, используя флаги -E -dM

g++ -E -dM file.cpp | grep MACRO

для того, «что он будет расширять»; Я использую ключ -E в gcc, который выдает предварительно обработанный вывод. Но нет никакого обратного следа, какой макрос пришел откуда (или был ли макрос вообще).

Другой вариант, который вы можете использовать, это -g3, он добавляет отладочную информацию, касающуюся макросов, то есть вы можете позже увидеть в своем отладчике определение каждого макроса.

Хорошая IDE может сделать это для вас по требованию через некоторую форму перехода к определению.

Используйте #warning. Это описание здесь .

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