gpt4 book ai didi

C 预处理器将 "int x"拆分为 int & x

转载 作者:太空狗 更新时间:2023-10-29 15:19:54 26 4
gpt4 key购买 nike

我需要能够获得以下内容:

#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);

甚至这样也可以:(我可以编写 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 实际使用之前,所以这不是世界末日,尽管它具有高度侵入性。

没有简单的方法可以让星号位于拆分的左侧。它可能会完成,但它会复杂得多,并且涉及对允许的变量名称列表进行限制,这在 IMO 中要糟糕得多。可能也更具侵入性,因为您几乎可以肯定在工作程序中拥有比类型更多的变量。

关于C 预处理器将 "int x"拆分为 int & x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20121278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com