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

标签 c++ c c-preprocessor

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

相关文章:

c - C#define 中的常量公式是否会影响效率?

c++ - 如何避免多平台qt代码中的specific#ifdef?

c - 如何忽略 C 中的某些整数输入

我可以检测宏中局部变量的存在吗?

c++ - 如何在 C++ 中检索基类的类型?

C - main() 命令行参数

c++ - windows 8 IShellIconOverlayIdentifier 外壳扩展无法正常工作

c++ - sizeof 操作数得到评估?

c++ - printf 从整数转义 unicode 字符

c - 将 m 位设置为 n 位