Я читаю исходный код phoneME. Это реализация FOSS JavaME. Он написан на C ++, и я наткнулся на это:
// Makes a string of the argument (which is not macro-expanded)
#define STR(a) #a
Я знаю C и C ++, но я никогда не читал что-то подобное. Что делает #
в #a
?
Кроме того, в том же файле есть:
// Makes a string of the macro expansion of a
#define XSTR(a) STR(a)
Я имею в виду, какой смысл определять новый макрос, если все он вызывает существующий макрос?
Исходный код находится в https://phoneme.dev.java.net/source/browse/phoneme/releases/phoneme_feature-mr2-rel-b23/cldc/src /vm/share/utilities/GlobalDefinitions.hpp?rev=5525&view=markup. Вы можете найти его с помощью CTRL + F.
В первом определении #a
означает напечатать аргумент макроса как нить. Это превратится, например, STR (foo)
в «foo»
, но он не будет выполнять макрорасширение своих аргументов.
Второе определение ничего не добавляет к первому, но, передав его аргумент другому макросу, оно вызывает полное макрорасширение его аргумента. Итак, XSTR (expr)
создает строку expr
со всеми полностью раскрытыми макросами.
Во-первых, вы должны знать, что эта пара макросов на самом деле довольно распространена. Первый делает именно то, что написано в комментарии - он превращает аргумент в строку, заключая ее в двойные кавычки.
Второй используется, чтобы вызвать макрорасширение аргумента. Обычно вы используете их вместе примерно так:
#define a value_a
printf("%s", XSTR(a));
Расширение макроса расширит a
до string_a
, а stringify превратит это в строку, поэтому на выходе будет значение_a
.
#a
называется оператором стрингайзера . Он принимает формальный параметр, в данном случае a
, и превращает его в строку, заключая ее в двойные кавычки.
Итак, если у вас есть:
string s = STR("my quoted string");
cout << s;
Результатом будет:
"my quoted string"
# - оператор преобразования в строку. Препроцессор превращает параметр в строку.
Допустим, у вас есть:
STR(MyClass);
Он будет предварительно обработан как:
"MyClass";
Уровень косвенности (с использованием XSTR ()) связан с правилами расширения макроса.