Принаймні деякі препроцесори 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?
Якщо ні, то в який момент поведінка переходить від визначеного С до визначеного GCC?