gpt4 book ai didi

c - 宏是否可以评估另一个参数的多个参数?

转载 作者:太空狗 更新时间:2023-10-29 17:15:38 27 4
gpt4 key购买 nike

我想做这样的事情:

#define NEED3ARGS(a1,a2,a3) ( "[" #a1 " + " #a2 " + " #a3 "]" )
#define MULTIARG() ARG1, ARG2, ARG3

NEED3ARGS( MULTIARG() )

我希望它输出如下内容:

( "[" "ARG1" " + " "ARG2" " + " "ARG3" "]" )

但是我有:

$ cpp multiarg.c 
# 1 "multiarg.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "multiarg.c"

multiarg.c:4:23: error: macro "NEED3ARGS" requires 3 arguments, but only 1 given
NEED3ARGS

有没有办法使用 ANSI-C/GNU GCC 和 C 预处理器来完成我想做的事情?

谢谢!

最佳答案

你需要一些间接的。使用 C99:

#define NEED3ARGS(a1,a2,a3) ( "[" #a1 " + " #a2 " + " #a3 "]" )
#define INVOKE_NEED3ARGS(...) NEED3ARGS(__VA_ARGS__)
#define MULTIARG() ARG1, ARG2, ARG3

INVOKE_NEED3ARGS( MULTIARG() )

(C99 不是严格要求的;您可以用固定元数宏替换可变参数宏。)

如果您需要使用 Visual C++ 编译您的源代码,您将需要更多的间接访问(因为 a compiler bug):

#define NEED3ARGS(a1,a2,a3) ( "[" #a1 " + " #a2 " + " #a3 "]" )
#define INVOKE_NEED3ARGS_(...) NEED3ARGS __VA_ARGS__
#define INVOKE_NEED3ARGS(...) INVOKE_NEED3ARGS_((__VA_ARGS__))
#define MULTIARG() ARG1, ARG2, ARG3

INVOKE_NEED3ARGS( MULTIARG() )

至于为什么 需要间接寻址:宏参数在被替换到替换列表中之前不会被评估和宏替换。因此,当您尝试 NEED3ARGS(MULTIARG()) 时,MULTIARG() 将不会被计算,直到 after 宏调用开始,所以它被处理作为单个参数。

INVOKE_NEED3ARGS 宏确保在调用 NEED3ARGS 之前完全评估其参数。 __VA_ARGS__ 被替换为 INVOKE_NEED3ARGS 的宏替换参数,即 ARG1, ARG2, ARG3,然后是 NEED3ARGS 使用这些参数调用。

关于c - 宏是否可以评估另一个参数的多个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234172/

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