gpt4 book ai didi

c - 如何在 C 的宏中多次调用一个函数?

转载 作者:太空狗 更新时间:2023-10-29 16:06:07 24 4
gpt4 key购买 nike

在我的开发环境中,一些 ioctl 调用在第一次失败,如果我再次调用相同的 ioctl 然后它返回成功。这是因为一些与硬件相关的时间同步问题。

所以我们正在寻找一些临时解决方案,比如用一个 MACRO 屏蔽所有 ioctl,在 MACRO 中调用 ioctl三遍。

但是 MACRO 会抛出编译错误。请提出一些解决方案来解决此问题。

示例代码

#include <stdio.h>

int func (int a, int b, int c)
{
return -1;
}

#define IOCTL_WRAPPER(a,b,c) \
{ \
int i = 0, retval = 0; \
while (i < 3) \
{ \
retval = func (a, b, c); \
if (retval != -1) \
{ \
break; \
} \
i++; \
} \
retval; \
}

int main ()
{
int RetVal = 0;

RetVal = IOCTL_WRAPPER(1, 2, 3);

if (RetVal != -1)
{
printf ("\n pass \n");
}
else
{
printf ("\n fail \n");
}

return 0;
}

编译错误

a.c: In function âmainâ:
a.c:9:13: error: expected expression before â{â token
{ \
^
a.c:27:14: note: in expansion of macro âIOCTL_WRAPPERâ
RetVal = IOCTL_WRAPPER(1, 2, 3);
^

最佳答案

我建议使用 do-while 宏样式来避免将来出现问题。为了解决您的问题,将 retVal 作为参数提供:

#define IOCTL_WRAPPER(retval, a,b,c)        \
do { \
int i = 0; \
while (i < 3) \
{ \
retval = func (a, b, c); \
if (retval != -1) \
{ \
break; \
} \
i++; \
} \
} while(0)

你的电话是:

IOCTL_WRAPPER(RetVal, 1, 2, 3);

关于c - 如何在 C 的宏中多次调用一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36150596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com