44

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 識別子であると考えることができます。全て。IDsomething

4

2 に答える 2

28

いいえ、何かを文字列化解除することはできません。

于 2011-08-08T12:35:03.613 に答える
1
//unstringify test

enum fruits{apple,pear};

#define IF_WS_COMPARE_SET_ENUM(x) if(ws.compare(L#x)==0)f_ret=x;

fruits enum_from_string(wstring ws)
{
 fruits f_ret;
 IF_WS_COMPARE_SET_ENUM(apple)
 IF_WS_COMPARE_SET_ENUM(pear)
 return f_ret;
}

void main()
{
 fruits f;
 f=enum_from_string(L"apple");
 f=enum_from_string(L"pear");
}
于 2013-05-24T03:16:48.133 に答える