2014-11-03 6 views
7

Ich lese es aus dem Quellcode von opencvwarum C-Code wie "while ((void) 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) 

Ich kann verstehen, während (0) in hier, aber warum hinzufügen "schreiben (ungültig) 0 ".

+5

Um ASCII Art ') 0, 0)'? – ikegami

+0

http://StackOverflow.com/Questions/4178695/c-what-is-the-purpose-of-casting-to-void – blfuentes

+0

mögliche Duplikate von [do {...} while (0) - was ist gut für?] (http://stackoverflow.com/questions/257418/do-while-0-what-isit-good-for) –

Antwort

13

Bei einer Schätzung ist es wahrscheinlich, eine Compiler-Warnung wie "Zustand ist konstant" zu halten.

Da (welche C klassifiziert als) ein konstanter Ausdruck kann kein Komma-Operator enthält, eine mit einigen Compilern überzeugen kann, dass ein Ausdruck keine Konstante ist (auch in einem Fall wie diesen, wo es wirklich ist).

+2

@Baldrickk: Das erklärt, warum Sie 'do {...} while (0)' verwenden, aber * nicht * warum Sie '((void) 0, 0)' als Bedingung verwenden. Wie diese Frage erklärt, "Ich kann while (0) hier verstehen, aber warum" (void) 0 '"hinzufügen, so ist dies ausschließlich und spezifisch über die Syntax der Bedingung, ** NICHT ** die Verwendung von a 'do {...} while (0)' im Allgemeinen, das ist * all * die anderen Fragen/Antworten diskutieren. Kurz gesagt, es ist kein Duplikat, und Sie haben den Punkt dieser Frage (und der Antwort) völlig verpasst. –

+0

Vielleicht haben Sie Recht, aber welcher Compiler könnte es tun? – no68

+1

@ no68: Das ist fast unmöglich zu erraten. Es ist auch möglich, dass es sich um ein Flussprogramm handelt und nicht um einen Compiler * an sich *. –

1

Ich bin nicht 100% sicher, ob das der Grund, warum, aber ich weiß für eine Tatsache, dass, wenn Sie

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

tun und dann auf die Warnstufe MSVC Compiler drehen 4 (/ W4), Sie wird die Warnung C4127 bekommen. Aber wenn Sie tun:

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

die Warnung C4127 geht weg. Vielleicht gibt es andere Gründe für die Verwendung while((void)0,0), anstelle von while(0), bin ich mir nicht sicher ...