gpt4 book ai didi

c - 附加到 __VA_ARGS__

转载 作者:太空狗 更新时间:2023-10-29 16:37:47 27 4
gpt4 key购买 nike

我知道我可以做到:

#define MACRO(api, ...) \
bool ret = api(123, ##__VA_ARGS__);

这只是一个示例,它是更复杂解决方案的一部分。关键是我需要将可变数量的参数附加到前 123 个。如果没有参数传递给 MACRO,## 使编译器去掉 123 参数后的逗号。

但现在我想将参数附加到 api,如下所示:

#define MACRO(api, ...) \
bool ret = api(__VA_ARGS__##, 456);

诺坎多。一种解决方案是使用两个宏,MACRO 和 MACRO_V,并使 _V 版本不处理任何参数。但是有没有办法让它与一个宏一起工作?

最佳答案

是的,你可以。以下最多支持 4 个参数,但可以轻松扩展以支持更多参数:

#define MACRO(api, ...) \
bool ret = api(__VA_ARGS__ VA_COMMA(__VA_ARGS__) 456)

/*
* VA_COMMA() expands to nothing if given no arguments and a comma if
* given 1 to 4 arguments. Bad things happen if given more than 4
* arguments. Don't do it.
*/
#define VA_COMMA(...) GET_6TH_ARG(,##__VA_ARGS__,COMMA,COMMA,COMMA,COMMA,)
#define GET_6TH_ARG(a1,a2,a3,a4,a5,a6,...) a6
#define COMMA ,

/* EXAMPLES */
MACRO(foo) /* bool ret = foo( 456) */
MACRO(foo,1) /* bool ret = foo(1 , 456) */
MACRO(foo,1,2,3,4) /* bool ret = foo(1,2,3,4 , 456) */
/* uh oh, too many arguments: */
MACRO(foo,1,2,3,4,5) /* bool ret = foo(1,2,3,4,5 5 456) */
MACRO(foo,1,2,3,4,5,6) /* bool ret = foo(1,2,3,4,5,6 5 456) */

同样的技巧用于:

解释

VA_COMMA 用六个附加参数围绕它的参数 (__VA_ARGS__):一个空参数(不必为空 - 它被丢弃)和四个逗号和之后是一个空参数。

这六个或更多参数被传递给 GET_6TH_ARG,顾名思义,它扩展为第六个参数。丢弃所有其他参数。

因此,MACRO(foo) 展开如下:

step 0: MACRO(foo)
step 1: bool ret = foo( VA_COMMA() 456)
step 2: bool ret = foo( GET_6TH_ARG(,COMMA,COMMA,COMMA,COMMA,) 456)
step 3: bool ret = foo( 456)

MACRO(foo,1) 展开如下:

step 0: MACRO(foo,1)
step 1: bool ret = foo(1 VA_COMMA(1) 456)
step 2: bool ret = foo(1 GET_6TH_ARG(,1,COMMA,COMMA,COMMA,COMMA,) 456)
step 3: bool ret = foo(1 COMMA 456)
step 4: bool ret = foo(1 , 456)

MACRO(foo,1,2) 展开如下:

step 0: MACRO(foo,1,2)
step 1: bool ret = foo(1,2 VA_COMMA(1,2) 456)
step 2: bool ret = foo(1,2 GET_6TH_ARG(,1,2,COMMA,COMMA,COMMA,COMMA,) 456)
step 3: bool ret = foo(1,2 COMMA 456)
step 4: bool ret = foo(1,2 , 456)

MACRO(foo,1,2,3,4,5) 展开如下:

step 0: MACRO(foo,1,2,3,4,5)
step 1: bool ret = foo(1,2,3,4,5 VA_COMMA(1,2,3,4,5) 456)
step 2: bool ret = foo(1,2,3,4,5 GET_6TH_ARG(,1,2,3,4,5,COMMA,COMMA,COMMA,COMMA,) 456)
step 3: bool ret = foo(1,2,3,4,5 5 456)

关于c - 附加到 __VA_ARGS__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4054085/

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