2012-03-14 4 views
22

До сих пор я добралась до:Как показать значение #define во время компиляции в GCC

#define ADEFINE "23" 
#pragma message ("ADEFINE" ADEFINE) 

, который работает, но что, если ADEFINE не является строкой?

#define ADEFINE 23 
#pragma message ("ADEFINE" ADEFINE) 

причина:

предупреждение: уродливо «#pragma сообщение», игнорируемая

В идеале я хотел бы быть в состоянии иметь дело с любым значением, в том числе не определен.

ответ

22

Для отображения макросов, которые не являются строками, stringify the macro:

#define STRINGIFY(s) XSTRINGIFY(s) 
#define XSTRINGIFY(s) #s 

#define ADEFINE 23 
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE)) 

Если у вас есть boost, вы можете использовать boost stringize, чтобы сделать это за вас:

#include <boost/preprocessor/stringize.hpp> 
#define ADEFINE 23 
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE)) 
+0

Что ж, я не думаю, что мой клиент будет очень рад, если бы это было добавлено как зависимость, но это похоже на доказательство существования. Возможно, мне стоит пойти и посмотреть на stringize.hpp –

+4

@JohnLawrenceAspden Я обновил ответ, как это сделать без повышения (или любой другой библиотеки). – rob05c

6

Я не уверен, что это сделает то, что вы хотите, но если вас интересует только это, чтобы отлаживать случайную проблему с макросом (так что вам не нужно отображать сообщение в каждом компиляторе), следующее может работать для вас. Используйте опцию gcc -E -dD для сброса #define директив вместе с выходом предварительной обработки. Затем труба, через grep видеть только строки, которые вы хотите:

// test.c 
#include <stdlib.h> 
#include <stdio.h> 
#define ADEFINE "23" 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
#undef ADEFINE 
#define ADEFINE 42 
    return 0; 
} 

В Команде gcc -E -dD -c test.c | grep ADEFINE показывает:

#define ADEFINE "23" 
#undef ADEFINE 
#define ADEFINE 42 

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

  • Нет связанных вопросов^_^