マクロ引数を文字列リテラルとして使用するにはどうすればよいですか?


90

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

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

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


これをどのように使おうとしていますか?
クリス2012年

回答:



28

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

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

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

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

これは質問にどのように答えますか、またはどのように役立ちますか?
jirigracik 2018

1
@ jirigracik-他の回答とは異なり、マクロ展開の文字列表示も取得できます
grepcake 2018年

3
持っているだけQUDI(x)では不十分な理由を説明するのに役立つと思います。
LRDPRDX

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

完全にはわかりませんが、"Hello" #x"(と#x "Hello")によって文字列がスペースなしで接着されているように見えます。これは場合によっては望ましいことなので、これはかなり良い答えです。
Smar 2017年

1
@Smar定数文字列の後にスペースを入れるようにしてくださいHello: "Hello " #x
jack

さて、私はそう思いました、それは貴重な情報なので、あなたもあなたの答えにそれを編集するべきです:)
Smar 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.