Что делает «#define STR (a) #a»?

Я читаю исходный код 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.

15
задан a3f 31 March 2015 в 03:19
поделиться

4 ответа

В первом определении #a означает напечатать аргумент макроса как нить. Это превратится, например, STR (foo) в «foo» , но он не будет выполнять макрорасширение своих аргументов.

Второе определение ничего не добавляет к первому, но, передав его аргумент другому макросу, оно вызывает полное макрорасширение его аргумента. Итак, XSTR (expr) создает строку expr со всеми полностью раскрытыми макросами.

20
ответ дан 1 December 2019 в 01:45
поделиться

Во-первых, вы должны знать, что эта пара макросов на самом деле довольно распространена. Первый делает именно то, что написано в комментарии - он превращает аргумент в строку, заключая ее в двойные кавычки.

Второй используется, чтобы вызвать макрорасширение аргумента. Обычно вы используете их вместе примерно так:

#define a value_a

printf("%s", XSTR(a));

Расширение макроса расширит a до string_a , а stringify превратит это в строку, поэтому на выходе будет значение_a .

4
ответ дан 1 December 2019 в 01:45
поделиться

#a называется оператором стрингайзера . Он принимает формальный параметр, в данном случае a , и превращает его в строку, заключая ее в двойные кавычки.

Итак, если у вас есть:

string s = STR("my quoted string");
cout << s;

Результатом будет:

"my quoted string"
4
ответ дан 1 December 2019 в 01:45
поделиться

# - оператор преобразования в строку. Препроцессор превращает параметр в строку.

Допустим, у вас есть:

STR(MyClass);

Он будет предварительно обработан как:

"MyClass";

Уровень косвенности (с использованием XSTR ()) связан с правилами расширения макроса.

5
ответ дан 1 December 2019 в 01:45
поделиться