Можно ли напечатать переменную препроцессора на C?
-
05-07-2019 - |
Вопрос
Можно ли вывести в 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.
Ну, то, что вы делаете, на самом деле нестандартно. Во-первых, " # предупреждение " или " # 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 ".