Отладка препроцессора С++
Я пытаюсь построить Амайю. Когда сбой сборки произошел с
error: ожидаемый unqualified-id before '(токен
Я выполнил g++ только с препроцессором (заменив параметр -c на -E) в файле, который не удалось скомпилировать, чтобы посмотреть, что происходит. Это создало файл в 80 000 строк, показывая мне, что "синий" был заменен на (2 < 8), что ясно объясняет ошибку. Если я исправлю это, файл компилируется отлично. Думаю, я мог бы жить с этим, но я хотел бы узнать, почему это происходит.
Есть ли способ отслеживать, как препроцессор заменяет определенную строку, в данном случае "Синий"?
================= Обновление ===================
Ну, я нашел виновника:
> headers=`g++ [omited for brevity] -M \
../../thotlib/dialogue/AmayaClassicNotebook.cpp`
> for file in $headers ; do grep -s -H Blue $file | grep "(2 << 8)";done
/usr/local/include/gc.h:#define Blue (2 << 8)
Таким образом, добавление #undef Blue исправило проблему. Поэтому использование этой комбинации -M и grep кажется ОК, но иногда определения препроцессора С++ могут быть реальным лесом; Мне было любопытно, есть ли какой-нибудь лучший способ, возможно, какой-то умный инструмент GNU.
Ответы
Ответ 1
Я нахожу бегущий
g++ ... -dD -E $file > $file.ii
чтобы быть очень полезным при распутывании проблем с предварительной обработкой. От man g++
:
-dD Dump all macro definitions, at the end of preprocessing,
in addition to normal output.
Ответ 2
Если никто не придумает ничего лучше (на основе информации о исходной строке в предварительно обработанном файле), вы можете использовать опцию -M, чтобы получить список заголовков, включенных в исходный файл, и выполнить поиск для "Синего". Я ожидаю, что это возможно для какой-то обфускации, означающей, что это не находит то, что вы ищете, но обычно вы найдете определение где-то.
Ответ 3
Что случилось с многолетним
find /src -exec grep Blue {} /dev/null ';'
Это обычно работает для меня, по крайней мере, как первый разрез.