可能重复:
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中而没有效果。
有关如何以体面的方式抑制此警告的任何评论?
谢谢
答案 0 :(得分:6)
警告是由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
答案 1 :(得分:2)
1)为什么不只是THROW_EXCEPTION("invalid parameters")
?
2)最后是while(true)
和break
?