Учись программированию на C++ Builder бесплатно!

Номер-знак или 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)
Поделиться