Подтвердить что ты не робот

Что это за макрос?

Я наткнулся на следующий код:

#include<stdio.h>
#define d(x) x(#x[3])
int main(){
d(putchar);
}

Что печатает c как вывод. Интересно, что делает макрос #define d(x) x(#x[3])? На языке C есть оператор вроде #? Я могу видеть это внутри тела макроса i.e здесь x(#x[3]). По моему нормальному глазу он выглядит чем-то другим, я вижу на языке С, но на самом деле. Что это делает?

Изменить: Каково реальное использование # в реальном мире?

Я новичок в C, и будет хорошо, если объяснение будет простым. Заранее спасибо.

4b9b3361

Ответ 1

Символ '#' является строкатором - он превращает символ в строку. Код становится

putchar ( "putchar" [3]);

Ответ 2

Знак hash означает "stringify", поэтому d(x) расширяется до putchar("putchar"[3]), откуда c.

Ответ 3

Из здесь:

Определения макросов функций принимают в качестве замены следующие два специальных оператора (# и ##): Если оператор # используется до того, как параметр используется в заменяющей последовательности, этот параметр заменяется строковым литералом (как если бы он был заключен между двойными кавычками)

#define str(x) #x
cout << str(test);

Проще говоря, он изменяет параметр "x" в строку. В этом случае тест становится массивом char, содержащим 't', 'e', ​​'s', 't', '\ 0'.

Ответ 4

# - это оператор предварительного процессора, который превращает литерал в строку. Фактически, ваш макрос d печатает четвертый char преобразованной строки вашего литерала.