如何在C中的宏内多次调用函数?

时间:2016-03-22 09:29:22

标签: c macros

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

所以我们要采取一些临时解决方案,例如用ioctl掩盖所有MACROMACRO调用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);
          ^

2 个答案:

答案 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。