我正在阅读 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/