Ati*_*liz 5 c preprocessor c-preprocessor
考虑宏
#define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d))
Run Code Online (Sandbox Code Playgroud)
我想在另一个宏中定义参数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 );
Run Code Online (Sandbox Code Playgroud)
对IP4_ADDR的第一次调用成功编译,而第二次调用失败
错误:宏“ IP4_ADDR”需要5个参数,但是给定
IP4_ADDR(&debug_host,DEBUG_HOST_IP4)仅2个参数;
有没有办法使DEBUG_HOST_IP4扩展正确,以便IP4_ADDR宏可以按预期工作?
编辑:IP4_ADDR宏来自第三方库,我宁愿不接触它,并冒着破坏别人代码的风险。当然,实现我自己的版本是一种选择。
如果你不能改变IP4_ADDR,这仍然很容易;只需将其包裹起来即可:
#define MY_IP4_ADDR(...) IP4_ADDR(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
在翻译过程中(只是移动所有参数,无论它们是什么),任何宏都会扩展。然后只需在代码中使用您的包装版本即可。
MY_IP4_ADDR(&debug_host, 192, 168, 0, 123 );
MY_IP4_ADDR(&debug_host, DEBUG_HOST_IP4 );
Run Code Online (Sandbox Code Playgroud)
你应该可以走了。