2016-02-10 3 views
0

Я работаю с устаревшим кодом C. В коде используется макрос:C: значение печати макроса

static int _main(A_MACRO *input_obj) 
{ 
.... 

Я не уверен, что тип данных a_macro объявляет input_obj быть. Как распечатать эту информацию на экране?

Я попытался сделать это следующим образом:

static int _main(A_MACRO *input_obj) 
{ 
sprintf("%s is the macro", A_MACRO); 
.... 

но в результате этого сообщения об ошибке:

error: expected primary-expression before ‘)’ token 
+0

«Я работаю с C унаследованным кодом» - Так почему добавлен тег для другого языка? И предоставить [mcve]. – Olaf

+0

Какой компилятор вы используете? 'gcc -E' испускает предварительно обработанный код. Но было бы проще просто «grep» из всех вхождений «#define A_MACRO». –

+1

Вам нужно найти в кодовой базе, где указан этот макрос. Запустите 'grep '# define. * A_MACRO" * .c * .h', чтобы найти его. – dbush

ответ

1

Вы можете создать «stringize» макрос, который преобразует определение в строку, как так:

#define STRINGIZE_(x) #x 
#define STRINGIZE(x) STRINGIZE_(x) 

Тогда вы просто "вызов" его с именем макроса:

printf("A_MACRO is defined as %s\n", STRINGIZE(A_MACRO)); 

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

gcc -dM file.c | grep A_MACRO 
+1

Вам нужна двухуровневая реализация 'STRINGIZE (x)' для работы с аргументами, которые сами являются макросами. Теперь у вас будет просто строка '' A_MACRO'', а не фактическое «значение» макроса «A_MACRO». Сначала: #define STRINGIZE_ (x) # x', затем '#define STRINGIZE (x) STRINGIZE_ (x)'. – AnT

+0

@AnT Реализация на двух уровнях не работает Печать «A_MACRO» Я думаю, что единственный способ - флаг '-dM'. – nikartix

+0

@Nick: Вы уверены, что воспроизвели его правильно? – AnT

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