我正在阅读phoneME的源代码。这是一个开源的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查找。
STR
和XSTR
宏的组合)被称为“双字符串技巧”。在问题如何确切地使用双字符串技巧?中有一个非常好的解释。 - sleske