Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Оператор 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)