2010-03-10 2 views
9

Есть ли способ, чтобы сделать GNU C Препроцессор, CPP (или какой-либо другой инструмент) список всех доступных макросов и их значения в заданной точке в C файл?Листинг C Константы/Макросы

Я ищу макросы, специфичные для системы, при портировании программы, которая уже совместима с Unix и загружает редкую группу системных файлов unix.

Просто интересно, есть ли более простой способ, чем охотиться за определениями.

+3

Интересный вопрос ... может быть, в том числе ваше намерение поможет вам получить лучший ответ? – fbrereto

ответ

15

Я не знаю, о каком-то месте в файле, но с использованием:

$ touch emptyfile 
$ cpp -dM emptyfile 

отвалов все те, по умолчанию. Выполнение этого же для файла C с некоторыми #include и #define строками в нем включает все эти. Думаю, вы могли бы обрезать свой файл на нужное вам место, а затем сделать то же самое?

От man page:

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

M
Вместо нормального вывода, формирует список #define директив для всех макросов, определенных во время выполнения препроцессора, в том числе предопределенных макросов. Это дает вам возможность узнать, что предопределено в вашей версии препроцессора. Предполагая, что у вас нет файла foo.h, команда

touch foo.h; cpp -dM foo.h 

покажет все предопределенные макросы.

Если вы используете -dM без опции -E, -dM интерпретируется как синоним -fdump-rtl-mach.

D
Как M исключения в двух отношениях: она не включает в себя предопределенные макросы, и выводит оба #define директивы и результат предварительной обработки. Оба выхода выводятся в стандартный выходной файл.

N
Как и D, но излучают только имена макросов, а не их расширения.

I
Выход #include директивы в дополнение к результату предварительной обработки.

+1

Просто любопытно - зачем нужна команда 'touch foo.h'? –

+0

@Michael, 'cpp -dM' без аргумента filename ждет данных на' stdin'. Вы можете это сделать, а затем введите '^ D', но создать пустой файл проще. –

+0

Спасибо, я забыл, что 'touch' был простым способом создания пустого файла. –

0

Почему бы не проконсультироваться по разделу Predefined-macros? Вам это нужно для создания проекта или чего-то подобного?

+0

Да * предопределенные макросы * - хороший раздел руководства gcc, но я ищу макросы, специфичные для системы, при портировании программы, которая уже является незаменимой для Linux, и загружает редкую группу системных файлов unix. Просто интересно, был ли более простой способ, чем искать определения. – ZJR

0

Чтобы перечислить «их значение в заданной точке в файл C» с помощью макросов, есть два, которые могут продемонстрировать данную точку в файле C, особенно при компиляции, и будет считаться полезным для отслеживания точка отказа ... рассмотреть этот пример код в файле с именем foo.c:

 
if (!(ptr = malloc(20))){ 
    fprintf(stderr, "Whoops! Malloc Failed in %s at line %d\n", __FILE__, __LINE__); 
} 

Если несколько раз, что код логика была использована в этом файле, и призыв к malloc терпел неудачу, вы бы получить этот выход:

 
Whoops! Malloc Failed in foo.c at line 25 

Номер строки будет отличаться в зависимости от того, где в источнике используется эта логика. Этот пример служит для показа, где можно использовать этот макрос ...

1

С помощью gcc вы можете использовать параметр «-dD», чтобы сбрасывать все макроопределения в стандартный вывод.

0

Вот link на страницу с обзором параметров командной строки в список предопределенных макросов для большинства компиляторов (gcc, clang ...).

+0

... и ответ всегда «-d» Ответ был дан 5 лет назад, некромант rtfm. Я пропущу цель этого ответа. – ZJR

Смежные вопросы