【发布时间】:2013-08-29 14:08:17
【问题描述】:
我在一个 SDK 示例程序中找到了以下宏。在这种情况下,#value 的含义是什么?
#define VALUE_CHAR(value) #value, value
【问题讨论】:
-
#value, value是什么意思?这真的是一个有效的陈述吗?
我在一个 SDK 示例程序中找到了以下宏。在这种情况下,#value 的含义是什么?
#define VALUE_CHAR(value) #value, value
【问题讨论】:
#value, value 是什么意思?这真的是一个有效的陈述吗?
字符串化。请参阅this 页面。
所以
VALUE_CHAR(1)
扩展到:
"1", 1
您可以使用这种宏来简化数组的初始化,例如:
#define MYDEF(x) { #x, x }
static struct {
const char *str;
int num;
} values[] = {
MYDEF(1),
MYDEF(2),
MYDEF(3)
};
【讨论】:
#value, value吗?因为我尝试使用#value,它确实有效。那为什么value需要写两次
{ "1", 1 },将字符串和整数初始化为匹配值。仅使用#value 它会“工作”(在编译的意义上),但会使整数未初始化。
struct values val; 和struct values[0] val; 但它抛出错误。请帮帮我。
struct myvalue { const char *str; int num; }; 然后static struct myvalue values[] = { ... };。等等
来自标准:
16.3.2 # 运算符 [cpp.stringize]
字符串文字是没有前缀的字符串文字。如果,在替换列表中,一个参数立即前面有一个
#预处理标记,则两者都被一个包含拼写的字符串文字预处理标记替换相应参数的预处理标记序列。
意思是:
#define VALUE_CHAR(value) #value, value
VALUE_CHAR(some_value)
将扩展为:
"some_value", some_value
由预处理器。
例如,著名的 BOOST 库使用此运算符对令牌进行字符串化:
#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)
#define BOOST_DO_STRINGIZE(X) #X
Test库中的使用示例:
#define BOOST_AUTO_TEST_SUITE( suite_name ) \
namespace suite_name { \
TheFunction( BOOST_STRINGIZE( suite_name ) ); \
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// ...
BOOST_AUTO_TEST_SUITE( MyTest );
将扩展为:
namespace MyTest {
TheFunction( "MyTest" );
// ^^^^^^^^
【讨论】: