如何在 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章