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

How to disable C4127 for do {} while(false)

本文关键字:false 禁用 C4127 while do      更新时间:2023-10-16

可能重复:
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    
...

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

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

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

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

我还试图将这些宏放入错误.h中,但没有效果。

关于如何以体面的方式压制这一警告,有什么意见吗?

感谢

警告是由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  

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

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

1)为什么不只是THROW_EXCEPTION("invalid parameters")
2) while(true)和CCD_?