Программа напечатает xyz, а не 123. Оператор # в определении макроса превращает текст аргумента в строковый литерал.
Определение вывода программы с макросом stringification
Программа напечатает xyz, а не 123. Оператор # в определении макроса превращает текст аргумента в строковый литерал.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно понять, какой текст будет напечатан при выполнении следующего кода.
# include <stdio.h>
# define str(s) #s
int main() {
const char *xyz = "123";
printf("%s\n", str(xyz));
return 0;
}
Ответ
Программа напечатает xyz, а не 123. Оператор # в определении макроса превращает текст аргумента в строковый литерал.
После обработки препроцессором str(xyz) превращается в "xyz". Значение переменной xyz при этом не читается: препроцессор работает с токенами до выполнения программы.
Это называется stringification. Если бы аргументом было имя другого макроса и требовалось сначала раскрыть его значение, используют дополнительный уровень макросов. В данном примере xyz — обычная переменная, поэтому дополнительное раскрытие всё равно не превратило бы её значение в 123.