По крайней мере, некоторые препроцессоры C позволяют вам преобразовывать значение макроса вместо его имени, передавая его через один функциональный макрос другому, который его преобразует в строку:
#define STR1(x) #x
#define STR2(x) STR1(x)
#define THE_ANSWER 42
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */
Примеры использования здесь .
Это работает, по крайней мере, в GCC и Clang (оба с -std=c99
), но я не уверен , как работает в терминах стандарта C.
Это поведение гарантировано C99?
Если да, то как С99 это гарантирует?
Если нет, то в какой момент поведение переходит от определенного C к определенному GCC?