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

StackOverflow https://stackoverflow.com/questions/1204202

  •  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 ".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top