Перечисление C константы / макросы - PullRequest
9 голосов
/ 11 марта 2010

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

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

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

Ответы [ 5 ]

15 голосов
/ 11 марта 2010

Я не знаю об определенном месте в файле, но использую:

$ touch emptyfile
$ cpp -dM emptyfile

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

со страницы руководства :

-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 голос
/ 11 марта 2010

С помощью gcc вы можете использовать опцию "-dD" для выгрузки всех определений макросов в стандартный вывод.

0 голосов
/ 25 ноября 2015

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

0 голосов
/ 11 марта 2010

Чтобы перечислить «свои значения в заданной точке в файле 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

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

0 голосов
/ 11 марта 2010

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

...