98

変数名の文字列リテラル表現と変数自体の両方を関数に渡すマクロを作成する方法を理解しようとしています。

たとえば、次の関数が与えられます。

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

これを実行できるように、マクロを作成したいと思います。

int my_val = 5;
CALL_DO_SOMETHING(my_val);

どちらが印刷されますか:my_val: 5

私は次のことを試みました:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

ただし、ご想像のとおり、引用符内のVARは置き換えられず、文字列リテラル「VAR」として渡されるだけです。したがって、マクロ引数を文字列リテラル自体に変換する方法があるかどうかを知りたいと思います。

4

4 に答える 4

162

プリプロセッサ#演算子を使用します:

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
于 2012-05-08T22:12:14.583 に答える
34

文字列化演算子を使用する場合:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}
于 2012-05-08T22:12:09.223 に答える
11
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian
于 2014-10-01T22:31:21.993 に答える
11

おそらくあなたはこの解決策を試してみてください:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";
于 2016-08-23T18:32:55.530 に答える