1

SDKのサンプルプログラムに以下のマクロを見つけました。このコンテキストでの #value の意味は何ですか?

#define VALUE_CHAR(value)       #value, value
4

2 に答える 2

7

文字列化。このページを参照してください。

そう

VALUE_CHAR(1)

次のように展開されます。

"1", 1

この種のマクロを使用して、配列の初期化を簡素化できます。たとえば、次のようになります。

#define MYDEF(x) { #x, x }

static struct {
    const char *str;
    int num;
} values[] = {
    MYDEF(1),
    MYDEF(2),
    MYDEF(3)
};
于 2013-08-29T14:10:05.017 に答える
3

標準から:

16.3.2 # 演算子 [cpp.stringize]

文字列リテラルは、プレフィックスのない文字列リテラルです。置換リストで、パラメーターの直前に#処理トークンがある場合、両方が、対応する引数の前処理トークン シーケンスのスペルを含む単一の文字列リテラルの前処理トークンに置き換えられます。

だということだ:

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

に展開されます:

"some_value", some_value

プリプロセッサによって。


たとえば、有名な BOOST ライブラリは、この演算子を使用して token を文字列化します。

#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" );
//               ^^^^^^^^
于 2013-08-29T14:15:41.500 に答える