在我的C ++实现(Visual Studio 2008实现)中,我在<cassert>
#ifdef NDEBUG
#define assert(_Expression) ((void)0)
我不明白需要将0转换为void。在我看来
#ifdef NDEBUG
#define assert(_Expression) (0)
甚至只是
#ifdef NDEBUG
#define assert(_Expression) 0
考虑到可以使用assert(expr)
的上下文,会这样做。
那么,在这种情况下, int 类型0的危险是什么,而不是类型 void 的0?任何 现实 示例?
答案 0 :(得分:22)
复杂表达式(void)0
的唯一目的是避免编译器警告。如果你只是一个裸露的,无用的表达式,编译器可能会警告一个无效的表达式。但是通过明确地向void
投射某些东西,你表明你的意思是这样做。
(如果编译器突然说“警告:表达式0;
无效,请考虑用户会感到多么困惑。”,当你所做的一切都切换到发布模式时。)
这也是C中的常见做法,你要说(void)printf("Hello");
告诉编译器你有意选择忽略函数的返回值。
(void)
演员表不仅仅是特定实现的选择;它是C标准所要求的。引用2011 ISO C标准(类似的措辞出现在1990和1999版本中):
如果
NDEBUG
被定义为源文件中的宏名称 如果包含<assert.h>
,则assert
宏定义为<强>
#define assert(ignore) ((void)0)
强>
C ++标准要求<cassert>
标题的内容与标准C <assert.h>
标题相同。