В любом случае, чтобы увидеть список макросов, определенных препроцессором?

Я хотел бы видеть все макросы, которые определяются вызовом компилятора, который я использую. Есть какой-либо способ сделать это? Я видел в руководстве, что вы можете использовать cpp -dM, но это не работает для меня. Возможно, я делаю что-то не так?

Когда я бегу:

cpp -dM

Я не получаю никакого вывода от препроцессора. Если я попытаюсь добавить -dM в качестве опции в gcc, я не замечу никакой разницы.


person Brandon Yates    schedule 05.06.2012    source источник
comment
У меня не работает - пожалуйста, будьте более описательными!   -  person Oliver Charlesworth    schedule 06.06.2012
comment
На моем компьютере с Linux вывод cpp -dM < /dev/null | wc -l равен 124, поэтому имеется 124 предопределенных значения. cpp -dM < /dev/null | less показывает мне, что они из себя представляют. Каков результат этих команд на вашем компьютере?   -  person Robᵩ    schedule 06.06.2012
comment
Извините, я попытался прояснить это немного   -  person Brandon Yates    schedule 06.06.2012
comment
Роб, спасибо, мне нужно попытаться выяснить, как это сделать из окон, которые, к сожалению, я застрял в использовании. Я использую кросс-компилятор исходного кода для arm. (по сути, порт gcc)   -  person Brandon Yates    schedule 06.06.2012


Ответы (2)


Вы можете использовать:

gcc -dM -E - < /dev/null

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

touch bla.c && gcc -dM -E bla.c

Например, на моем компьютере:

$ touch bla.c && gcc -dM -E bla.c | wc -l
486
$ gcc -dM -E - < /dev/null | wc -l
124
$
person ouah    schedule 05.06.2012
comment
также полезны -xc, -xc++ и -std=..., чтобы вы могли сравнивать определения, специфичные для языка и диалекта. - person Christoph; 06.06.2012
comment
@Christoph Кристоф, на самом деле я попробовал сначала gcc -xc -dM -E - < /dev/null для своего второго примера, но, похоже, это не работает с -dM (тот же результат, что и в первом примере) - person ouah; 06.06.2012
comment
@Christoph, хорошо, так что это было исправлено, потому что это не работает на моем gcc-4.4.3/Linux. - person ouah; 06.06.2012

По умолчанию cpp -dM будет читать входной файл со стандартного ввода и записывать в стандартный вывод. Поскольку вы не пытаетесь предварительно обработать какой-либо ввод, вы можете передать ему пустой ввод, используя /dev/null:

# Option 1
cpp -dM < /dev/null
# Optio n2
cpp -dM /dev/null

В Windows вы можете использовать псевдофайл NUL вместо /dev/null.

person Adam Rosenfield    schedule 05.06.2012