考虑一下宏
#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的调用成功地编译,而第二个调用在
错误:宏"IP4_ADDR“需要5个参数,但只有2个给定 IP4_ADDR(&debug_host,DEBUG_HOST_IP4 );
是否有一种使DEBUG_HOST_IP4正确展开的方法,以便IP4_ADDR宏能够按预期工作?
编辑: IP4_ADDR宏来自第三方库,我不想碰它,并且冒着破坏别人代码的风险。当然,实现我自己的版本是一种选择。
发布于 2019-09-15 17:43:04
如果您不能更改IP4_ADDR,这仍然非常容易;只需包装它:
#define MY_IP4_ADDR(...) IP4_ADDR(__VA_ARGS__)在翻译过程中(它只会将所有的参数移过去,不管它们是什么),任何宏都会展开。然后在代码中使用您的包装版本。
MY_IP4_ADDR(&debug_host, 192, 168, 0, 123 );
MY_IP4_ADDR(&debug_host, DEBUG_HOST_IP4 );你应该可以走了。
发布于 2019-09-13 14:22:19
在这种情况下,可以将外部宏设置为varargs宏:
#define IP4_ADDR(ipaddr, ...) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(__VA_ARGS__))宏调用必须有正确的参数数。内部宏调用可以工作,因为参数是在重新封装主体之前展开的。
varargs语法允许您提供四个参数或使用扩展到它们的宏。
如果不想更改IP_ADDR的定义,可以通过包装宏间接调用它:
#define CALL(macro, __VA_ARGS__) macro(...)
// ...
CALL(IP4_ADDR, &debug_host, DEBUG_HOST_IP4 );发布于 2019-09-13 14:16:26
试着像这样定义:
#define IP4_ADDR(ipaddr, HOST) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(HOST))DEGUB_HOST_IP4只会在第二部分被替换。因此,当您将它作为参数传递时,它只被替换为a,而忽略了b、c、d。
https://stackoverflow.com/questions/57924933
复制相似问题