2013-08-29 78 views
2

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

#define VALUE_CHAR(value)  #value, value 

这可能是个愚蠢的问题。但我不清楚为什么它是。谁能帮我?

谢谢你的建议

+0

'#value,value'是什么意思?这真的是一个有效的陈述吗? –

+0

这不是新的。 http://stackoverflow.com/questions/14351971/what-does-x-inside-ac-macro-mean/ – devnull

+0

http://www.cquestions.com/2009/01/what-is-use-of-and例如,运营商在c.html –

回答

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) 
}; 
+0

+1! – devnull

+0

@trojanfoe:我们是否需要'#value,value'? 因为我用'#value'试过了,它确实有效。那么为什么'价值'需要被写两次 –

+0

@RasmiRanjanNayak它取决于那个特定的宏意味着你正在使用的API /框架。 – trojanfoe

3

从标准:

16.3.2#运算符[cpp.stringize]

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

这意味着:由预处理器

"some_value", some_value 

#define VALUE_CHAR(value) #value, value 
VALUE_CHAR(some_value) 

将扩大到。


例如,著名的Boost库使用该运营商stringize令牌:

#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"); 
//    ^^^^^^^^