作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑宏观
#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/
我是一名优秀的程序员,十分优秀!