gpt4 book ai didi

c - 如何将 C 宏的一些参数定义为另一个宏?

转载 作者:太空狗 更新时间:2023-10-29 15:01:39 25 4
gpt4 key购买 nike

考虑宏观

#define IP4_ADDR(ipaddr, a,b,c,d)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d))

我想在另一个宏中定义参数 a、b、c、d。所以我这样做了:

#define DEBUG_HOST_IP4 192, 168, 0, 123

IP4_ADDR(&debug_host, 192, 168, 0, 123 );
IP4_ADDR(&debug_host, DEBUG_HOST_IP4 );

第一次调用 IP4_ADDR 编译成功,而第二次调用失败

error: macro "IP4_ADDR" requires 5 arguments, but only 2 given
IP4_ADDR(&debug_host, DEBUG_HOST_IP4 );

有没有办法使 DEBUG_HOST_IP4 正确扩展,以便 IP4_ADDR 宏可以按预期工作?

编辑:IP4_ADDR 宏来自第三方库,我宁愿不碰它,以免破坏其他人的代码。当然,实现我自己的版本是一种选择。

最佳答案

在这种情况下,您可以将外部宏设为可变参数宏:

#define IP4_ADDR(ipaddr, ...)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(__VA_ARGS__))

宏调用必须有正确数量的参数。内部宏调用之所以有效,是因为在重新扫描正文之前扩展了参数。

可变参数语法允许您提供四个参数或使用扩展到它们的宏。

如果您不想更改 IP_ADDR 的定义,您可以通过包装器宏间接调用它:

#define CALL(macro, __VA_ARGS__) macro(...)
// ...
CALL(IP4_ADDR, &debug_host, DEBUG_HOST_IP4 );

关于c - 如何将 C 宏的一些参数定义为另一个宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57924933/

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