Операторы препроцессора # и ##

В языках С и C++ предоставляется возможность работы с двумя операторами препроцессора: # и ##. Эти операторы используются в директиве определения макроса #define.

Оператор # превращает аргумент, которому он предшествует, в строку, заключенную в кавычки. Рассмотрим, например, следующую программу.

Копировать
#include <iostream>
using namespace std;

#define mkstr(s) # s

int main()
{
	cout < mkstr(Я люблю C++);

	return 0;
}

Препроцессор превратит строку

Копировать
cout << mkstr(Я люблю C++);

в строку

Копировать
cout << "Я люблю C++";.

Оператор ## используется для конкатенации двух лексем. Например, в программе

Копировать
#include <iostream>
using namespace std;

#define concat(a, b) a ## b

int main()
{
	int xy = 10;
	
	cout < concat(x, y);
	
	return 0;
}

препроцессор превратит строку

Копировать
cout << concat(x, у);

в строку

Копировать
cout << xy;

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