web-dev-qa-db-ja.com

マクロ引数を文字列リテラルとして使用する方法は?

変数名の文字列リテラル表現と変数自体の両方を関数に渡すマクロを記述する方法を見つけようとしています。

たとえば、次の関数を考えます。

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」として渡されます。だから、マクロ引数を文字列リテラル自体に変える方法があるかどうかを知りたいです。

71
Ian

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

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
115
Morwenn

文字列化演算子を使用します:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}
23
chris
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian
7

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

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";
3
Zili