我需要能够获得以下内容:
#define MY_MACRO(PARAM1,PARAM2) \
MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\
MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAMNAME_OF(PARAM2));\
to cause
MY_MACRO(int x,char *z)
编译为
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char*,z);
或者如果它编译为:
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,*z);
或者甚至这也可以:(我可以编写 MY_OTHER_MACRO 来处理任一结果)
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,z);
或者,如果有某种方法可以计算由空格分隔的标记(并假设“*”是单独的标记,我也可以使用它 - 例如 2 vs 3)
据我所知,通常标记是用逗号分隔的。有什么办法可以使用另一个角色吗?
您可以做到这一点,但只有一个极其困难的限制,即您必须提前知道所有类型名称:它不适用于任何用户定义的类型,除非用户也将它们添加到已知类型列表中 - 无可否认,不难。
接受这个限制,你可以这样做:
#define LPAREN (
#define RPAREN )
#define COMMA ,
#define CAT(L, R) CAT_(L, R)
#define CAT_(L, R) L ## R
#define EXPAND(...) __VA_ARGS__
#define SPLIT(OP, D) EXPAND(OP CAT(SPLIT_, D) RPAREN)
#define SPLIT_int LPAREN int COMMA
#define SPLIT_char LPAREN char COMMA
#define SPLIT_float LPAREN float COMMA
#define SPLIT_double LPAREN double COMMA
#define MY_MACRO(A, B) \
SPLIT(MY_OTHER_MACRO, A); SPLIT(MY_OTHER_MACRO, B);
MY_MACRO(int x, char * z) // emits MY_OTHER_MACRO ( int , x ); MY_OTHER_MACRO ( char , * z );
如上所述,将一种类型添加到已知类型列表中是一个单行代码 (#define SPLIT_myType LPAREN myType COMMA
),并且可以在程序中的任何位置完成,只要它出现在该类型实际使用之前SPLIT
,所以这不是世界末日,尽管它具有很强的侵入性。
没有简单的方法可以让星号位于分割线的左侧。它可能可以完成,但会复杂得多,并且涉及对允许的变量名称列表进行限制,这在我看来要糟糕得多。可能也更具侵入性,因为几乎可以肯定,工作程序中的变量比类型还要多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)