C プリプロセッサを使用する場合、次のようにマクロ引数を文字列化できます。
#define TO_STRING(x) "a string with " #x
したがって、使用すると、結果は次のようになります。
TO_STRING(test)
次のように展開されます。"a string with test"
逆に何かいい方法はないでしょうか?入力引数として文字列リテラルを取得し、C 識別子を生成しますか? 例えば:
TO_IDENTIFIER("some_identifier")
次のように展開されます。some_identifier
回答ありがとうございます。
編集:何のために必要なのか疑問に思っている人のために:
3D エンジンのシーン グラフ内のノードを文字列識別子で参照したいのですが、同時に、タイトなループで文字列を比較することは避けたいと考えていました。そこで、コンパイルのビルド前のステップで実行し、定義済みの文字列を検索する簡単なツールを作成することにしましたID("something")
。次に、そのようなトークンごとに、括弧内の文字列の CRC32 を計算し、それらの数値識別子を含む #defines を含むヘッダー ファイルを生成します。たとえば、文字列の"something"
場合は次のようになります。
#define __CRC32ID_something 0x09DA31FB
ID(x)
次に、生成されたヘッダー ファイルは、マクロを使用して各 cpp ファイルにインクルードされます。もちろん、ID("something")
は に展開される__CRC32ID_something
ため、実質的にコンパイラが認識するのは、人間にわかりやすい文字列ではなく、単純な整数識別子です。もちろん、ここでは単純に解決しますが、引用符を使用する方がより理にかなっていると思いました。マクロID(something)
がどのように機能するかを知らないプログラマーは、実際にはそのような識別子が存在しない場合でも、引用符がないと C 識別子であると考えることができます。全て。ID
something