【问题标题】:why to write C code like "while((void)0, 0)"为什么要写像“while((void)0, 0)”这样的C代码
【发布时间】:2014-12-30 08:34:17
【问题描述】:

我是从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)

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

【问题讨论】:

标签: c opencv


【解决方案1】:

猜测,可能是关闭编译器警告,如“条件不变”。

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

【讨论】:

  • @Baldrickk:这解释了为什么你使用do { ... } while (0),但不是为什么你使用((void)0, 0) 作为条件。正如这个问题所解释的,“我可以理解这里的 while(0),但是为什么要添加 '(void)0'”,所以这完全是关于条件的语法,NOT一般使用do { ... } while (0),这是所有其他问题/答案所讨论的。简而言之,它不是重复的,您完全错过了这个问题(和答案)的重点。
  • 也许你是对的,但哪个编译器可以做到?
  • @no68:这几乎不可能猜到。它也有可能是一个 lint 程序,而不是一个编译器本身
【解决方案2】:

我不是 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),我不确定……

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2015-06-13
    • 2021-04-14
    • 2021-12-15
    • 2013-08-20
    相关资源
    最近更新 更多