如何在 do while(false) 中禁用 C4127 [重复]

Posted

技术标签:

【中文标题】如何在 do while(false) 中禁用 C4127 [重复]【英文标题】:How to disable C4127 for do while(false) [duplicate]如何在 do while(false) 中禁用 C4127 [重复] 【发布时间】:2012-08-20 17:45:50 【问题描述】:

可能重复: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 中,但没有效果。

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

谢谢

【问题讨论】:

我确定你可以将命令行参数传递给编译器 总结:正如在其他问题中回答的那样,禁用警告。不仅在本地使用 #pragma warning,而且完全禁用它。 好的,但是为什么不留下没有do...while的范围呢? @Lol4t0 这是一个常见的构造,使得FAIL(...) 需要一个额外的分号来形成完整的语句。这是允许if (...) FAIL(...); else 并让else 属于if 【参考方案1】:

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

【讨论】:

你真的不应该有一个链接作为你的答案。 我得到了error C2017: illegal escape sequence 用于__pragma 的使用。 MSVS 2010 无法做到这一点。 @q0987: 不知道为什么.. 这是一个有效的关键字 (msdn.microsoft.com/en-us/library/d9x1s805.aspx) @q0987:确保'\' 字符后面没有空格或制表符,这些字符应该表示行继续。 这比副本中的答案更好。【参考方案2】:

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

【讨论】:

+1 - 我不知道为什么这被否决了,这是一个简单而干净的解决方法,如果你在那里放一个 cmets 解释你为什么这样做,那么它就会很清楚。跨度> @Caesar:因为它没有解决将 do/while(false) 与多行处理器指令和相关警告一起使用的问题。 @0A0D 也许我错过了理解 OP,但据我了解,他想要一个更干净的代码。这比你给出的例子更干净,功能也是一样的。 @Caesar:不,他想知道一种更好的方法来禁用警告而不引起混乱,但仍然想要多行宏。 fwiw,我对否决票背后的逻辑很满意,但无论如何,这有助于 OP 将其作为答案。

以上是关于如何在 do while(false) 中禁用 C4127 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

do......while(false)

do while(false)实用技巧

VB 语言中do loop while循环语句如何使用?

Java 中do...while()的使用

JS中 do while循环问题

php学习笔记-do while循环