По крайней мере, некоторые препроцессоры 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?
Если да, то как C99 это гарантирует?
Если нет, то в какой момент поведение переходит от C-определенного к GCC?