首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将C宏的某些参数定义为另一个宏?

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

Stack Overflow用户
提问于 2019-09-13 13:52:31
回答 3查看 192关注 0票数 5

考虑一下宏

代码语言:javascript
复制
#define IP4_ADDR(ipaddr, a,b,c,d)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d))

我想在另一个宏中定义参数a,b,c,d。所以我做了这个:

代码语言:javascript
复制
#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宏来自第三方库,我不想碰它,并且冒着破坏别人代码的风险。当然,实现我自己的版本是一种选择。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-15 17:43:04

如果您不能更改IP4_ADDR,这仍然非常容易;只需包装它:

代码语言:javascript
复制
#define MY_IP4_ADDR(...) IP4_ADDR(__VA_ARGS__)

在翻译过程中(它只会将所有的参数移过去,不管它们是什么),任何宏都会展开。然后在代码中使用您的包装版本。

代码语言:javascript
复制
  MY_IP4_ADDR(&debug_host, 192, 168, 0, 123 );
  MY_IP4_ADDR(&debug_host, DEBUG_HOST_IP4 );

你应该可以走了。

票数 1
EN

Stack Overflow用户

发布于 2019-09-13 14:22:19

在这种情况下,可以将外部宏设置为varargs宏:

代码语言:javascript
复制
#define IP4_ADDR(ipaddr, ...)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(__VA_ARGS__))

宏调用必须有正确的参数数。内部宏调用可以工作,因为参数是在重新封装主体之前展开的。

varargs语法允许您提供四个参数或使用扩展到它们的宏。

如果不想更改IP_ADDR的定义,可以通过包装宏间接调用它:

代码语言:javascript
复制
#define CALL(macro, __VA_ARGS__) macro(...)
// ...
CALL(IP4_ADDR, &debug_host, DEBUG_HOST_IP4 );
票数 3
EN

Stack Overflow用户

发布于 2019-09-13 14:16:26

试着像这样定义:

代码语言:javascript
复制
#define IP4_ADDR(ipaddr, HOST)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(HOST))

DEGUB_HOST_IP4只会在第二部分被替换。因此,当您将它作为参数传递时,它只被替换为a,而忽略了b、c、d。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57924933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档