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

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宏来自第三方库,我宁愿不接触它,并冒着破坏别人代码的风险。当然,实现我自己的版本是一种选择。

Cha*_*ria 1

如果你不能改变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)

你应该可以走了。