2014-11-03 45 views
7

我來自OpenCV的源代碼閱讀爲什麼寫C代碼一樣「而((無效)0,0)」

#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)在這裏,但爲什麼要加上「 (無效)0" 。

+5

要包括ASCII藝術')0,0)'? – ikegami 2014-11-03 16:25:29

+0

http://stackoverflow.com/questions/4178695/c-what-is-the-purpose-of-casting-to-void – blfuentes 2014-11-03 16:26:32

+0

可能重複[do {...} while(0) - 它有什麼好處對於?](http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for) – 2014-11-03 16:27:06

回答

13

有人猜測,它可能會關閉編譯器警告,如「條件是恆定的」。

由於(C分類爲)常量表達式不能包含逗號運算符,因此可以說服某些編譯器表達式不是常量(甚至在這種情況下,它確實存在)。

+2

@Baldrickk:這解釋了爲什麼你使用'do {...} while(0)',而不是*爲什麼你使用'((void)0,0)'作爲條件。正如這個問題所解釋的那樣,「我可以在這裏理解(0),但爲什麼要添加'(void)0'」,所以這完全是關於條件語法的具體說明,而不是**使用'do {...} while(0)'一般來說,這是所有*其他問題/答案的討論。總之,它不是重複的,你完全錯過了這個問題的答案(和答案)。 – 2014-11-03 18:25:14

+0

也許你是對的,但哪個編譯器可以做到這一點? – no68 2014-11-04 09:08:05

+1

@ no68:這幾乎不可能猜到。它也可能是一個lint程序,而不是編譯器*本身*。 – 2014-11-04 14:27:37

1

我不是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),我不確定...

相關問題