我正在阅读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字符串,所有宏均已完全展开。

关于c++ - “#define STR(a) #a”是做什么的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3534070/

10-12 14:39