Как мне показать значение #define во время компиляции в gcc - PullRequest
23 голосов
/ 14 марта 2012

До сих пор я дошел до:

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

Что работает, но что, если ADEFINE не строка?

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

вызывает:

предупреждение: некорректное '#pragma message', игнорируется

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

Ответы [ 2 ]

26 голосов
/ 14 марта 2012

Чтобы отобразить макросы, которые не являются строками, преобразовать макрос в строку :

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

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

Если у вас есть / хотите повысить , вы можете использовать boostizeize , чтобы сделать это для вас:

#include <boost/preprocessor/stringize.hpp>
#define ADEFINE 23
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE))
7 голосов
/ 14 марта 2012

Я не уверен, что это будет делать то, что вы хотите, но если вы заинтересованы только в этом для отладки случайной проблемы с макросом (так что это не то, что вам нужно отображать в сообщении для каждой компиляции), следующее можетработать для вас.Используйте опцию 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
...