9

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

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

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

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

谢谢

4

2 回答 2

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  

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

#define FAIL(message) \  
    MULTI_LINE_MACRO_BEGIN \  
        std::ostringstream ossMsg; \
        ossMsg << message; \
        THROW_EXCEPTION(ossMsg.str());\  
    MULTI_LINE_MACRO_END  
于 2012-08-20T17:51:04.853 回答
2

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

于 2012-08-20T17:50:08.910 回答