Оператор преобразования в строку (#)

Оператор number-sign или stringizing (#) преобразует параметры макроса в строковые литералы без расширения определения параметра. Он используется только с макросами, которые принимают аргументы. Если он стоит перед формальным параметром в определении макроса, то фактический аргумент, передаваемый вызовом макроса, заключается в кавычки и обрабатывается как строковый литерал. Далее этим строковым литералом заменяется каждое сочетание строкового оператора с формальным параметром, которое встречается в определении макроса.

Примечание.

Расширение Microsoft C (версии 6.0 и более ранних) для стандарта ANSI C, которое ранее развертывало формальные аргументы макросов в строковых литералах и символьных константах, больше не поддерживается. Код, зависящий от этого расширения, должен быть перезаписан с помощью оператора stringizing (#).

Пробел, предшествующий первому маркеру, и следует последнему маркеру фактического аргумента, игнорируется. Все пробелы между токенами в фактическом аргументе сокращаются в полученном строковом литерале до одиночных пробелов. Таким образом, если комментарий происходит между двумя маркерами в фактическом аргументе, он уменьшается до одного пробела. Результирующий строковый литерал автоматически объединяется с любыми смежными строковыми литералами, разделенными только пробелами.

Кроме того, если символ, содержащийся в аргументе, обычно требует escape-последовательности при использовании в строковом литерале, например кавычка () или символ обратной косой черты ("\), необходимой обратной косой косой черты автоматически вставляется перед символом.

Оператор строки Microsoft C++ не работает правильно, если он используется со строками, включающими escape-последовательности. В этом случае компилятор создает ошибку компилятора C2017.

Примеры

В следующем примере показано определение макроса, включающее оператор строки и основную функцию, которая вызывает макрос:

// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
   stringer( In quotes in the printf function call );
   stringer( "In quotes when printed to the screen" );
   stringer( "This: \"  prints an escaped double quote" );
}

Макросы stringer развертываются во время предварительной обработки, создавая следующий код:

int main() {
   printf_s( "In quotes in the printf function call" "\n" );
   printf_s( "\"In quotes when printed to the screen\"" "\n" );
   printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
In quotes in the printf function call
"In quotes when printed to the screen"
"This: \"  prints an escaped double quote"

В следующем примере показано, как развернуть параметр макроса:

// stringizer_2.cpp
// compile with: /E
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)

См. также

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