Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要编写C代码,比如;而((无效)0,0)";_C_Opencv - Fatal编程技术网

为什么要编写C代码,比如;而((无效)0,0)";

为什么要编写C代码,比如;而((无效)0,0)";,c,opencv,C,Opencv,我是从opencv的源代码中读到的 #define IPP_FILTER_MEDIAN_BORDER(ippType, ippDataType, flavor) \ do \ { \ if (ippiFilterMedianBorderGetBufferSize(dstRoiSize, maskSize, \ ippDataType, CV_MAT_CN(type), &bufSize) >= 0) \ { \

我是从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)
#定义IPP_过滤器_中间值_边框(ippType、ippDataType、flavor)\
做\
{ \
如果(ippiFilterMedianBorderGetBufferSize,dstRoiSize\
ippDataType,CV\u MAT\u CN(type),&bufSize)>=0)\
{ \
Ipp8u*缓冲区=IPPSalloc_8u(bufSize)\
IppStatus status=ippiFilterMedianBorder_35;##flavor(src.ptr(),(int)src.step\
dst.ptr(),(int)dst.step,dstRoiSize,maskSize\
IPPBerderRepl,(ippType)0,缓冲区)\
ippsFree(缓冲区)\
如果(状态>=0)\
{ \
CV_IMPL_ADD(CV_IMPL_IPP)\
返回\
} \
} \
setIppErrorStatus()\
} \
而((无效)0,0)

我可以理解这里的while(0),但是为什么要添加“(void)0”。

猜测一下,这可能是为了关闭一个编译器警告,比如“condition is constant”


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

我不能100%确定这是否是原因,但我知道如果你这样做的话

#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)
,还有其他原因,我不确定…

是否包括ASCII艺术
)0,0)
?可能重复@V-X,我看不到答案——这个问题不是关于
do
的使用——并且这个问题被标记为另一个问题的重复。@V-X,答案的第一部分是答案,它已经作为答案发布了,而这不在你链接的问题中。@Baldrickk:这解释了为什么你使用
do{…}while(0)
,但不是为什么你使用
((void)0,0)
作为条件。正如这个问题所解释的,“我可以理解while(0)在这里,但是为什么要添加'(void)0'”,所以这仅仅是关于条件的语法,而不是使用
do{…},而(0)
一般来说,这是所有其他问题/答案所讨论的。简言之,它不是重复的,你完全没有抓住这个问题(和答案)的重点。也许你是对的,但哪个编译器可以做到这一点呢?@no68:这几乎是不可能猜测的。它也可能是一个lint程序,而不是编译器本身。