Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Stringizing (|) препроцессора

CuBook05

Номер-знак или 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

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