将0转为无效
在我的C ++实现(Visual Studio 2008实现)中,我在看到以下行
#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而不是0类型为0的危险是什么? 任何现实的例子?
复杂表达式(void)0
的唯一目的是避免编译器警告。 如果你只是一个裸露的,无用的表达式,编译器可能会警告一个没有效果的表达式。 但是通过明确地将某些东西void
你表明你的意思是这样做。
(如果编译器突然说“警告:表达式0;
没有效果。”,当你所做的一切都切换到发布模式时,想想它会给用户带来多么混乱。)
这也是C中的常见做法,你会说(void)printf("Hello");
告诉编译器你有意选择忽略函数的返回值。
(void)
演员不仅仅是特定实现的选择; 它是C标准所要求的。 引用2011 ISO C标准(类似的措辞出现在1990年和1999年版本中):
如果
NDEBUG
被定义为源文件中包含的点的宏名称,则
assert
宏被简单地定义为
#define assert(ignore) ((void)0)
C ++标准要求
标头的内容与标准C
标头相同。