Russian Belarusian English German Japanese Ukrainian

Номер-знак или stringizing (#) оператор преобразует параметры макроса к строковым литералам без развернутого определения параметра. Используется только с макросами, которые принимают аргументы. Если предшествует формальный параметр в определении макроса, то фактический аргумент, передаваемый вызовом макроса заключен в кавычки и обрабатывается как строковый литерал. Строковый литерал заменяет каждое вхождение сочетание stringizing оператор и формальный параметр в определении макроса.

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

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

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

Оператор Visual C++ stringizing не может функционировать должным образом во всех случаях.

Примеры


В следующем примере показано определение макроса, который включает stringizing оператор и функцию main, которая вызывает макрос. Такие вызовы будут развернуты во время предварительной обработки, создавая следующий код:

int main() {
printf_s( "In quotes in the printf function call\n" "\n" );
printf_s( "\"В кавычках при печати на экран\"\n" "\n" );
printf_s( Образом: \\\" печать преобразованное в escape-последовательность двойная кавычка\"" "\n" );
}
// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
stringer( In quotes in the printf function call );
stringer( "В кавычках при печати на экран" );
stringer( Образом: \" печать преобразованное в escape-последовательность двойная кавычка" );
}

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

// 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)

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Поиск по сайту