Подтвердить что ты не робот

Как показать значение #define во время компиляции в gcc

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

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

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

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

причины:

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

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

4b9b3361

Ответ 1

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

#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))

Ответ 2

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