SDKのサンプルプログラムに以下のマクロを見つけました。このコンテキストでの #value の意味は何ですか?
#define VALUE_CHAR(value) #value, value
文字列化。このページを参照してください。
そう
VALUE_CHAR(1)
次のように展開されます。
"1", 1
この種のマクロを使用して、配列の初期化を簡素化できます。たとえば、次のようになります。
#define MYDEF(x) { #x, x }
static struct {
const char *str;
int num;
} values[] = {
MYDEF(1),
MYDEF(2),
MYDEF(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" );
// ^^^^^^^^