2013-08-29 80 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"); 
//    ^^^^^^^^