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

Возможно ли напечатать препроцессорную переменную в C?

Можно ли напечатать для stderr значение переменной препроцессора в C? Например, у меня есть сейчас:

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR is greater than 10
#endif

Но я бы хотел сделать следующее:

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR=%PP_VAR%
#endif

Возможно ли что-то подобное в C?

4b9b3361

Ответ 1

Вы можете распечатать значение переменной препроцессора в visual studio. Следующее выводит значение _MSC_VER:

#define STRING2(x) #x
#define STRING(x) STRING2(x)

#pragma message(STRING(_MSC_VER))

Не знаю, насколько это стандартно.

Ответ 2

Это работает с GCC 4.4.3:

#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)

дает:

src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017

Ответ 3

Многие компиляторы C поддерживают #warning (но это не определено стандартом C).

Однако GCC по крайней мере не выполняет предварительную обработку данных, что означает, что трудно увидеть значение переменной.

#define PP_VAR 123
#warning "Value of PP_VAR = " PP_VAR
#warning "Value of PP_VAR = " #PP_VAR
#warning "Value of PP_VAR = " ##PP_VAR

GCC производит:

x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR

Ответ 4

Использовать оператор переднего прогона процессора: ## TOKEN_NAME

Как отмечалось ранее, используемые вами препроцессорные директивы нестандартны, поэтому YMMV.

Ответ 5

Хорошо, что вы делаете, на самом деле нестандартно. Во-первых, директива "#warning" или "#warn" не является стандартной. Во-вторых, при использовании препроцессора строка должна начинаться с символа фунта без пробелов:

#ifdef BLAH1
#    define BLAH2 // OK, because pound is at the very left.
#endif

#ifdef BLAH3
     #define BLAH4 // Works on many compilers, but is non-standard.
#endif

Поскольку вы уже используете нестандартное расширение, вам нужно будет найти документацию конкретного препроцессора/компилятора, который вы используете, чтобы увидеть, что он говорит о "#warning".