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

no6*_*o68 9 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)
Run Code Online (Sandbox Code Playgroud)

我可以理解while(0)在这里,但为什么要添加"(void)0".

Jer*_*fin 15

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

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

  • @Baldrickk:这解释了为什么你使用`do {...} while(0)`,但*不*为什么你使用`((void)0,0)`作为条件.正如这个问题所解释的那样,"我可以理解while(0)在这里,但为什么要添加'(void)0'",所以这完全是关于条件的语法,**不**使用a `do {...} while(0)`一般来说,这是*all*其他问题/答案讨论.简而言之,它不是重复的,你完全错过了这个问题(和答案). (2认同)