Существует ли способ сделать GNU C Препроцессором, cpp (или некоторый другой инструмент) перечисляют все доступные макросы и их значения в данной точке в файле C?
Я ищу определенные для системы макросы при портировании программы, это уже - здравый смысл Unix и загрузка редкого набора системных файлов Unix.
Просто удивление, если существует более легкий путь, чем отправление на охоту для определений.
Я не знаю об определенном месте в файле, но использую:
$ 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
в дополнение к результату предварительной обработки.
Почему бы не обратиться к разделу Предопределенные макросы ? Вам это нужно для создания проекта или чего-то подобного?
В gcc вы можете использовать опцию «-dD», чтобы выгрузить все определения макросов в стандартный вывод.
Чтобы перечислить «их значения в заданной точке в файле 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
Номер строки будет отличаться в зависимости от того, где в источнике используется эта логика. Этот пример служит для того, чтобы показать, где можно использовать этот макрос ...