Ответ 1
Вы можете распечатать значение переменной препроцессора в visual studio. Следующее выводит значение _MSC_VER:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message(STRING(_MSC_VER))
Не знаю, насколько это стандартно.
Можно ли напечатать для 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?
Вы можете распечатать значение переменной препроцессора в visual studio. Следующее выводит значение _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 производит:
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
Использовать оператор переднего прогона процессора: ## TOKEN_NAME
Как отмечалось ранее, используемые вами препроцессорные директивы нестандартны, поэтому YMMV.
Хорошо, что вы делаете, на самом деле нестандартно. Во-первых, директива "#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".