Можно ли напечатать переменную препроцессора в C? - PullRequest
41 голосов
/ 30 июля 2009

Возможно ли вывести в 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 ?

Ответы [ 5 ]

50 голосов
/ 13 февраля 2012

Вы можете распечатать значение переменной препроцессора в Visual Studio. Ниже выводится значение _MSC_VER:

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

#pragma message(STRING(_MSC_VER))

Не уверен, насколько это стандартно.

11 голосов
/ 11 сентября 2013

Это работает с 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
5 голосов
/ 30 июля 2009

Многие компиляторы 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
3 голосов
/ 30 июля 2009

Используйте оператор вставки токена препроцессора: ## TOKEN_NAME

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

1 голос
/ 30 июля 2009

Ну, то, что вы делаете, на самом деле нестандартно. Во-первых, директива "#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".

...