assert , ASSERT中的void

 

assert   

        C\C++语言提供的断言宏.

定义如下:

         #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

ASSERT

        MFC提供的断言宏

定义如下:

       #define ASSERT(f)          DEBUG_ONLY((void) ((f) || !::AfxAssertFailedLine(THIS_FILE, __LINE__) || (AfxDebugBreak(), 0)))


今天有同事问道为什么在表达式的前面都有一个void.我想可能和ASSERT宏的使用场景有关吧. ASSERT/assert只在调试状态下才起作用,也就是说ASSERT/assert中的expression最好不能有side affect.如此表达式,自然不能随便做为子表达式,插入其他表达式中.想来,表达式类型强制转换成为void就是防止 ASSERT/assert 宏成为子表达式的吧.


翻了翻标准,重新了解了一下 void 的定义和约束:

The void type has an empty set of values.  The void type is an incomplete type that cannot be completed.
It is used as the return type for functions that do not return a value.  Any expression can be explicitly con-
verted to type cv void (5.4).  An expression of type void shall be used only as an expression statement
(6.2), as an operand of a comma expression (5.18), as a second or third operand of ?:(5.16), as the operand
of typeid, or as the expression in a return statement (6.6.3) for a function with the return type void.


任何表达式均可以显式转换成为 cv void [一直没有理解清楚,暂时理解成为void].  而 void 类型的表达式只可以用在在 表达式语句,逗号表达式,条件表达式,typeid以及返回值为void的函数的return中.这样转换没有完全达到目的,但是利用类型检查,已经可以应付大部分场景.


你可能感兴趣的:(C/C++,mfc,file,function,语言,c)