我是从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;。
答案 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)
,我不确定......