在我的开发环境中,一些ioctl
调用第一次失败,如果我再次调用ioctl
,则返回成功。
这是因为一些与硬件相关的时间同步问题。
所以我们要采取一些临时解决方案,例如用ioctl
掩盖所有MACRO
,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);
^
答案 0 :(得分:4)
我建议使用SHOW SLAVE STATUS
宏样式来避免未来问题。要解决您的问题,请将retVal作为参数:
do-while
你的电话将是:
#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)
答案 1 :(得分:2)
您的宏扩展为代码块,这不是表达式。
为什么不使用内联函数?示例代码:
static inline int ioctl_wrapper(int a, int b, int c)
{
int i = 0, retval = 0;
while (i < 3)
{
retval = func (a, b, c);
if (retval != -1)
{
break;
}
i++;
}
return retval;
}
虽然不需要内联ioctl_wrapper()
,但通常认为将优化作业留给编译器(尤其是现代编译器)会更好。如果它认为ioctl_wrapper()
不应该内联,则使用宏来强制内联&#34;可能不是一个好主意。
我突然想到存在另一种非常琐碎的方法:
retval = (func(a, b, c) + 1) || (func(a, b, c) + 1) || (func(a, b, c) + 1);
如果三个调用之一的返回值不是-1,则retval
将为1;否则,它将为0。