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

C++ 如何为do{}while禁用C4127(false),c++,visual-c++,compiler-warnings,c4127,C++,Visual C++,Compiler Warnings,C4127,可能重复: 但我不喜欢这个解决方案 我还试图将这些宏设置为错误.h,但没有效果 您对如何以适当的方式抑制此警告有何评论 谢谢1)为什么不干脆抛出异常(“无效参数”)? 2) while(true)和在结尾处中断?警告是由于while(false)引起的。这是一个如何解决此问题的示例。来自站点的示例(您必须为代码重新编写): 只需在开始和结束之间插入代码: #define FAIL(message) \ MULTI_LINE_MACRO_BEGIN \ std::

可能重复:

但我不喜欢这个解决方案

我还试图将这些宏设置为错误.h,但没有效果

您对如何以适当的方式抑制此警告有何评论

谢谢

1)为什么不干脆
抛出异常(“无效参数”)


2)
while(true)
在结尾处中断

警告是由于
while(false)
引起的。这是一个如何解决此问题的示例。来自站点的示例(您必须为代码重新编写):

只需在开始和结束之间插入代码:

#define FAIL(message) \  
    MULTI_LINE_MACRO_BEGIN \  
        std::ostringstream ossMsg; \
        ossMsg << message; \
        THROW_EXCEPTION(ossMsg.str());\  
    MULTI_LINE_MACRO_END  
#定义失败(消息)
多行\u宏\u开始\
标准::ostringstream OSSMG\

ossMsg我相信您可以将命令行arg传递给编译器摘要:正如在另一个问题中所回答的,禁用警告。不只是在本地使用
#pragma warning
,而是将其完全禁用。好吧,但为什么不在不使用
的情况下只保留作用域呢?@Lol4t0这是一个常见的构造,使得
失败(…)
需要额外的分号来形成完整的语句。如果(…)失败(…),则允许
;else
并使else
属于
if
。你真的不应该有一个链接作为你的答案。我得到了
错误C2017:使用
\u pragma
的非法转义序列。MSVS 2010无法给出正确答案。@q0987:不确定原因。。这是一个有效的关键字()@q0987:确保
'\'
字符后没有空格或制表符,这些字符应该表示行继续。这是一个比副本中的答案更好的答案。+1-我不知道为什么这被否决,这是一个简单而清晰的修复方法,如果您在其中添加注释来解释为什么要这样做,那么它将变得清晰。@Caesar:因为它没有解决将do/while(false)与多行处理器指令和相关警告一起使用的问题。@0A0D可能我不理解OP,但据我所知,他需要更清晰的代码。凯撒:不,他想知道一种更好的方法来禁用警告而不造成混乱,但仍然想要多行宏。fwiw,我对否决票背后的逻辑很冷静,但很可能这有助于OP将其作为一个答案。
        #pragma warning( push )
        #pragma warning( disable : 4127 )
        FAIL("invalid parameters");
        #pragma warning( pop )
#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  
#define FAIL(message) \  
    MULTI_LINE_MACRO_BEGIN \  
        std::ostringstream ossMsg; \
        ossMsg << message; \
        THROW_EXCEPTION(ossMsg.str());\  
    MULTI_LINE_MACRO_END