Возможно ли напечатать препроцессорную переменную в 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 ?

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

 #define STRING2(x) #x #define STRING(x) STRING2(x) #pragma message(STRING(_MSC_VER)) 

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

Это работает с 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 

Многие компиляторы 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 производит:

 xc:2:2: warning: #warning "Value of PP_VAR = " PP_VAR xc:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR xc:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR 

Используйте оператор препроцессора для работы с токеном: ## TOKEN_NAME

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

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

 #ifdef BLAH1
 # define BLAH2 // ОК, потому что фунт находится слева.
 #endif

 #ifdef BLAH3
      #define BLAH4 // Работает на многих компиляторах, но не является стандартным.
 #endif

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