【问题标题】: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

标签: c++ visual-c++ compiler-warnings c4127


【解决方案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 将其作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多