Определение вывода программы с макросом stringification

Программа напечатает xyz, а не 123. Оператор # в определении макроса превращает текст аргумента в строковый литерал.

Короткий ответ

Что ответить на собеседовании

Программа напечатает 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее