17

これが私が作成したいくつかのマクロです:

#define MODULE_NAME moduleName
#define MODULE_STRUCT MODULE_NAME ## _struct
#define MODULE_FUNCTION(name) MODULE_NAME ## _ ## name

これらの定義の後で、次の拡張を実行したいと思います。

MODULE_STRUCT   -->   moduleName_struct
MODULE_FUNCTION(functionName)    -->    moduleName_functionName

ただし、トークン貼り付け演算子を追加すると、MODULE_FUNCTIONおよびMODULE_STRUCT内でのMODULE_NAMEの展開は発生しなくなりました...それらを一緒に貼り付ける場合、MODULE_NAMEはリテラル文字列と見なされるようです。

これを回避する方法はありますか?

4

1 に答える 1

21

C では、トークン貼り付け演算子のオペランドは##展開されません。

拡張を取得するには、2 番目のレベルの間接化が必要です。

#define CAT(x, y) CAT_(x, y)
#define CAT_(x, y) x ## y
于 2012-09-27T21:52:35.703 に答える