2014-11-03 10 views
7

tôi đọc nó từ mã nguồn của opencvtại sao phải viết mã C như "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) 

Tôi có thể hiểu được khi (0) ở đây, nhưng tại sao để thêm " (void) 0 ".

+5

Để bao gồm nghệ thuật ASCII ') 0, 0)'? – ikegami

+0

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

+0

bản sao có thể có của [do {...} trong khi (0) - điều gì là tốt cho?] (http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good-for) –

Trả lời

13

Khi đoán, có thể bạn sẽ tắt cảnh báo trình biên dịch như "điều kiện là hằng số".

Vì (những gì C phân loại thành) biểu thức không thể bao gồm toán tử dấu phẩy, sử dụng toán tử có thể thuyết phục một số trình biên dịch biểu thức không phải là hằng số (ngay cả trong trường hợp như thế này).

+2

@Baldrickk: Điều đó giải thích tại sao bạn sử dụng 'do {...} trong khi (0)', nhưng * không * tại sao bạn sử dụng '((void) 0, 0)' làm điều kiện. Khi câu hỏi này giải thích, "Tôi có thể hiểu khi (0) ở đây, nhưng tại sao phải thêm '(void) 0'", do đó, điều này là duy nhất và cụ thể về cú pháp của điều kiện, ** KHÔNG ** việc sử dụng 'do {...} trong khi (0)' nói chung, đó là * tất cả * các câu hỏi/câu trả lời khác thảo luận. Tóm lại, nó không phải là một bản sao, và bạn đã hoàn toàn bỏ lỡ điểm của câu hỏi này (và câu trả lời). –

+0

Có thể bạn đã đúng, nhưng trình biên dịch nào có thể làm điều đó? – no68

+1

@ no68: Điều đó gần như không thể đoán được. Nó cũng có thể là một chương trình lint chứ không phải là một trình biên dịch * mỗi se *. –

1

Tôi không chắc chắn 100% nếu đó là lý do tại sao, nhưng tôi biết một thực tế rằng nếu bạn làm

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

Và sau đó rẽ vào mức độ cảnh báo MSVC Compiler 4 (/ W4), bạn sẽ nhận được cảnh báo C4127. Nhưng nếu bạn làm:

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

cảnh báo C4127 biến mất. Có thể có các lý do khác để sử dụng while((void)0,0), thay vì while(0), tôi không chắc chắn ...

Các vấn đề liên quan