C要拆分的预处理器";INTX";进入国际及;x

C要拆分的预处理器";INTX";进入国际及;x,c,c-preprocessor,variadic-macros,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));\ 引起 MY_MACRO(int x,char *z) 编成 MY_OTHER_MACRO(int,x); MY_OTHER_MACRO(char*,z); 或

我需要能够获得以下信息:

#define MY_MACRO(PARAM1,PARAM2) \
 MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\
 MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAMNAME_OF(PARAM2));\
引起

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);
或者,即使这样也可以:(我可以编写我的\u OTHER\u宏来处理任何一个结果)

或者,如果有某种方法可以计算由空格分隔的标记(并且假设“*”是单独的标记,我也可以使用它-例如2对3) 据我所知,令牌通常用逗号分隔。有没有办法使用另一个字符?

这是不可能的

一种替代方法是为类型和标识符设置不同的参数

MY_MACRO(int, x, char *, z)

您可以做到这一点,但必须有一个非常困难的限制,即您必须事先知道所有类型名:除非用户也将它们添加到已知类型列表中,否则它无法处理任何用户定义的类型-这不难

接受此限制,您可以执行以下操作:

#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
实际使用之前就可以执行,因此它不是世界末日,尽管它具有高度侵入性


要使星号位于拆分的左侧,没有简单的方法。这可能是可以做到的,但要复杂得多,需要对允许的变量名列表进行限制,而IMO的情况要糟糕得多。可能更具侵入性,因为几乎可以肯定,在一个工作程序中,变量比类型多。

不太可能。宏可以连接,而不是分离。@zch是的,但它们可以连接,形成产生分离结果的宏的名称。是的,这或多或少就是我要替换的。如果有答案,我会把这个问题留在这里,但我想我只需要让最终用户代码看起来笨拙,不像c。当输入以点开头时,是否有办法让
拆分
宏工作,例如:
拆分(MY_OTHER_macro,.name)
#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 );