这意味着宏中的#value

时间:2013-08-29 14:08:17

标签: c++ c++11

我在SDK示例程序中找到了以下宏。在这种情况下,#value是什么意思?

#define VALUE_CHAR(value)       #value, value

这可能是一个愚蠢的问题。但我不清楚为什么这样做。任何人都可以帮助我吗?

谢谢你的推荐

2 个答案:

答案 0 :(得分:7)

字串。请参阅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)
};

答案 1 :(得分:3)

来自标准:

  

16.3.2#运算符[cpp.stringize]

     

字符串文字 string-literal ,没有前缀。如果,替换列表中的 ,参数立即前面有#预处理令牌,两者都会被单个字符串文字预处理令牌替换,该令牌包含拼写相应参数的预处理标记序列。

这意味着:

#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

测试库中的用法示例:

#define BOOST_AUTO_TEST_SUITE( suite_name )                             \
namespace suite_name {                                                  \
  TheFunction( BOOST_STRINGIZE( suite_name ) );                         \
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// ...

BOOST_AUTO_TEST_SUITE( MyTest );

将扩展为:

namespace MyTest {
    TheFunction( "MyTest" );
//               ^^^^^^^^