"#define STR(a)#a"有什么作用?

Vit*_*sta 15 c c++ c-preprocessor

我正在阅读phoneME的源代码.这是一个FOSS JavaME实现.它是用C++编写的,我偶然发现了这个:

// Makes a string of the argument (which is not macro-expanded)
#define STR(a) #a
Run Code Online (Sandbox Code Playgroud)

我知道C和C++,但我从来没有读过这样的东西.什么是##a做什么?

此外,在同一个文件中,有:

// Makes a string of the macro expansion of a
#define XSTR(a) STR(a)
Run Code Online (Sandbox Code Playgroud)

我的意思是,如果它只是调用一个现有的宏,那么定义一个新宏的用途是什么?

源代码位于https://phoneme.dev.java.net/source/browse/phoneme/releases/phoneme_feature-mr2-rel-b23/cldc/src/vm/share/utilities/GlobalDefinitions.hpp?rev=5525&view =标记.您可以使用CTRL + F找到它.

JSB*_*ոգչ 20

在第一个定义中,#a表示将宏参数作为字符串打印.这将打开,如STR(foo)"foo",但它不会做它的参数宏扩展.

第二个定义不会向第一个定义添加任何内容,但是通过将其参数传递给另一个宏,它会强制其参数的完全宏扩展.因此,XSTR(expr)创建一个expr包含所有宏完全展开的字符串.


Dav*_*vid 5

#是字符串化运算符.预处理器从参数中生成一个字符串.

说你有:

STR(MyClass);
Run Code Online (Sandbox Code Playgroud)

它将被预处理为:

"MyClass";
Run Code Online (Sandbox Code Playgroud)

间接级别(使用XSTR())与宏扩展规则有关.