【发布时间】:2020-01-15 09:46:06
【问题描述】:
考虑宏
#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 宏来自第三方库,我不想碰它,并且冒着破坏别人代码的风险。当然,实现我自己的版本是一种选择。
【问题讨论】:
-
Boost.Preprocessor 有
BOOST_PP_EXPAND,你可以检查它的实现。 Boost 是 C++,但是这两种语言的预处理器在很多方面是相似的,这个特定的宏应该是可移植的。 -
查看this article,尤其是关于扩展和递归的部分。
-
毫无疑问不受欢迎但最明智的建议是首先摆脱宏。
IP4_ADDR看起来是一个很好的函数候选者。 -
您无法更改预处理器扩展宏的方式,因此您的替代方法是更改宏或更改宏的每次使用。我在答案中添加了第二个选项。
标签: c c-preprocessor preprocessor