uns*_*zed 4 c c-preprocessor variadic-macros
我需要能够得到以下内容:
#define MY_MACRO(PARAM1,PARAM2) \
MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\
MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAMNAME_OF(PARAM2));\
Run Code Online (Sandbox Code Playgroud)
引起
MY_MACRO(int x,char *z)
Run Code Online (Sandbox Code Playgroud)
编译为
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char*,z);
Run Code Online (Sandbox Code Playgroud)
如果它编译为:它不会是世界末日:
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,*z);
Run Code Online (Sandbox Code Playgroud)
或者甚至这也可以:(我可以编码MY_OTHER_MACRO来处理任何一个结果)
MY_OTHER_MACRO(int,x);
MY_OTHER_MACRO(char,z);
Run Code Online (Sandbox Code Playgroud)
或者,如果有一些方法来计算由空格分隔的标记(并假设"*"是单独的标记,我也可以使用它 - 例如2对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 );
Run Code Online (Sandbox Code Playgroud)
如上所述,将类型添加到已知类型的列表中是一个单行(#define SPLIT_myType LPAREN myType COMMA),并且可以在程序中的任何地方完成,只要它在实际使用类型之前到来SPLIT,所以它不是世界末日,虽然它是高度侵入性的.
没有简单的方法可以让星号位于分割的左侧.它可能会完成,但它会更复杂,并且涉及将限制放在允许的变量名称列表上,IMO更加糟糕.可能更具侵入性,因为你几乎肯定会有更多的变量而不是工作程序中的类型.