为什么编写C代码,如" while((void)0,0)"

时间:2014-11-03 16:22:53

标签: c opencv

我是从opencv

的源代码中读到的
#define IPP_FILTER_MEDIAN_BORDER(ippType, ippDataType, flavor) \
    do \
    { \
        if (ippiFilterMedianBorderGetBufferSize(dstRoiSize, maskSize, \
            ippDataType, CV_MAT_CN(type), &bufSize) >= 0) \
        { \
            Ipp8u * buffer = ippsMalloc_8u(bufSize); \
            IppStatus status = ippiFilterMedianBorder_##flavor(src.ptr<ippType>(), (int)src.step, \
                dst.ptr<ippType>(), (int)dst.step, dstRoiSize, maskSize, \
                ippBorderRepl, (ippType)0, buffer); \
            ippsFree(buffer); \
            if (status >= 0) \
            { \
                CV_IMPL_ADD(CV_IMPL_IPP); \
                return; \
            } \
        } \
        setIppErrorStatus(); \
    } \
    while ((void)0, 0)

我可以在这里了解(0),但为什么要添加&#34;(void)0&#34;。

2 个答案:

答案 0 :(得分:15)

猜测,它可能会关闭像“条件不变”这样的编译器警告。

由于(C分类为)一个常量表达式不能包含逗号运算符,因此使用一个可以说服某些编译器表达式不是常量(即使在这样的情况下,它确实存在)。 / p>

答案 1 :(得分:3)

我不是百分百确定这是否是原因,但我知道如果你这样做

#define FOO do{ doStuff(); } while(0)

然后打开MSVC编译器警告级别4(/ W4),您将收到警告C4127。但如果你这样做:

#define FOO do{ doStuff(); } while((void)0,0)

警告C4127消失了。也许还有其他原因使用while((void)0,0)代替while(0),我不确定......