如何禁用C4127 for do {} while(false)

时间:2012-08-20 17:45:51

标签: c++ visual-c++ compiler-warnings c4127

  

可能重复:
  C/C++: How to use the do-while(0); construct without compiler warnings like C4127?

//file error.h

        #define FAIL(message) \
        do { \
            std::ostringstream ossMsg; \
            ossMsg << message; \
            THROW_EXCEPTION(ossMsg.str());\
        } while (false)


//main.cpp

...

FAIL("invalid parameters"); // <<< warning C4127: conditional expression is constant    

...

如您所见,警告与do {} while(false)

相关

我只能想出以下方法来禁用警告:

        #pragma warning( push )
        #pragma warning( disable : 4127 )
        FAIL("invalid parameters");
        #pragma warning( pop )

但我不喜欢这个解决方案。

我也尝试将这些宏放在error.h中而没有效果。

有关如何以体面的方式抑制此警告的任何评论?

谢谢

2 个答案:

答案 0 :(得分:6)

警告是由while(false)引起的。这个site给出了如何解决此问题的示例。网站示例(您必须为代码重新处理):

#define MULTI_LINE_MACRO_BEGIN do {  
#define MULTI_LINE_MACRO_END \  
    __pragma(warning(push)) \  
    __pragma(warning(disable:4127)) \  
    } while(0) \  
    __pragma(warning(pop))

#define MULTI_LINE_MACRO \  
        MULTI_LINE_MACRO_BEGIN \  
            std::printf("Hello "); \  
            std::printf("world!\n"); \  
        MULTI_LINE_MACRO_END  

只需在BEGIN和END之间插入代码:

#define FAIL(message) \  
    MULTI_LINE_MACRO_BEGIN \  
        std::ostringstream ossMsg; \
        ossMsg << message; \
        THROW_EXCEPTION(ossMsg.str());\  
    MULTI_LINE_MACRO_END  

答案 1 :(得分:2)

1)为什么不只是THROW_EXCEPTION("invalid parameters")
2)最后是while(true)break