Отладка препроцессора С++

Я пытаюсь построить Амайю. Когда сбой сборки произошел с

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 ';'

Это обычно работает для меня, по крайней мере, как первый разрез.