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包含所有宏完全展开的字符串.
#是字符串化运算符.预处理器从参数中生成一个字符串.
说你有:
STR(MyClass);
Run Code Online (Sandbox Code Playgroud)
它将被预处理为:
"MyClass";
Run Code Online (Sandbox Code Playgroud)
间接级别(使用XSTR())与宏扩展规则有关.