1

特別な命名スキームに従って新しい関数を定義するために、次のマクロがあります。

#define CREATE_HOOK_STUB( func ) void ##func_STUB() { /* some code*/ }

ただし、プリプロセッサは常に連結void##func_STUBますが、その位置の空白を保持したいのは明らかです。

に文字列を追加するだけでよいことはわかっていますが##func_STUB、これは私が望んでいることではありません。これをどのように解決しますか?

4

1 に答える 1

7

私はあなたが本当に欲しいものはより近いと思います:

#define CREATE_HOOK_STUB( func ) void func##_STUB() { /* some code*/ }

ただし、トークン貼り付け演算子の動作に関する追加の詳細が記載されている、このリンクされたSOの回答も確認する必要があります。

トークン貼り付け('##')または文字列化('#')の前処理演算子を使用する場合に注意する必要があるのは、すべての場合に正しく機能するために、余分なレベルの間接参照を使用する必要があるということです。

これを行わず、トークン貼り付け演算子に渡される項目自体がマクロである場合、おそらく期待したものとは異なる結果が得られます...

于 2009-12-01T20:58:14.220 に答える