gpt4 book ai didi

c - C可变参数宏是否能够递归扩展##__VA_ARGS__?

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:12 31 4
gpt4 key购买 nike

variadic macro提到了 gcc 的 VA_ARGS

我做了以下实验。

#define EVAL(f,...) eval(f,build_args(args,__VA_ARGS__ , args_end))

EVAL(f,a) // => eval(f,build_args(args,a, args_end))
EVAL(f,a,b) // => eval(f,build_args(args,a,b, args_end))

到目前为止还不错,但是

EVAL(f) // => eval(f,build_args(args, , args_end))

我必须至少提供一个参数,我根据手册解决问题,使用'##'。

#define EVAL(f,...) eval(f,build_args(args,##__VA_ARGS__ , args_end))
EVAL(f,a) // => eval(f,build_args(args,a, args_end))
EVAL(f,a,b) // => eval(f,build_args(args,a,b, args_end))
EVAL(f) // => eval(f,build_args(args, args_end))

到目前为止还不错,但是

#define EVAL(f,...) eval(f,build_args(args,##__VA_ARGS__ , args_end))
EVAL(f,EVAL(g,a)) // => eval(f,build_args(args,EVAL(g,a) , args_end))

我们可以看到第二个EVAL没有展开,但是没有'##',第二个EVAL展开了。

#define EVAL(f,...) eval(f,build_args(args,##__VA_ARGS__ , args_end))
EVAL(f,EVAL(g,a)) // => eval(f,build_args(args,
// eval(g,build_args(args,a , args_end),
// args_end))

情况是这样

  1. 没有##,我必须至少提供一个参数,但宏可以递归展开。
  2. 对于 ##,零参数是可以的,但宏不能被递归计算。

我可以同时解决这两个问题吗?

最佳答案

你能试试这个吗?

#define _build_args(args,f,...) eval(f,build_args(args,__VA_ARGS__))
#define EVAL(f...) _build_args(args,f,args_end)

它似乎对我有利,因为:

EVAL(f,a)
EVAL(f,a,b)
EVAL(f)
EVAL(f,EVAL(g,a))

给出:

eval(f,build_args(args,a,args_end))
eval(f,build_args(args,a,b,args_end))
eval(f,build_args(args,args_end))
eval(f,build_args(args,eval(g,build_args(args,a,args_end)),args_end))

关于c - C可变参数宏是否能够递归扩展##__VA_ARGS__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30499621/

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