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

q09*_*987 9 c++ compiler-warnings visual-c++ c4127

可能重复:
C/C++:如何使用do-while(0); 构造没有编译器警告,如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    

...
Run Code Online (Sandbox Code Playgroud)

如您所见,警告与该警告有关do {} while(false).

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

        #pragma warning( push )
        #pragma warning( disable : 4127 )
        FAIL("invalid parameters");
        #pragma warning( pop )
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

小智 6

警告是由于while(false).此站点提供了如何解决此问题的示例.网站示例(您必须为代码重新处理):

#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  
Run Code Online (Sandbox Code Playgroud)

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

#define FAIL(message) \  
    MULTI_LINE_MACRO_BEGIN \  
        std::ostringstream ossMsg; \
        ossMsg << message; \
        THROW_EXCEPTION(ossMsg.str());\  
    MULTI_LINE_MACRO_END  
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比副本中更好的答案. (2认同)

dje*_*lin 1

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