繁体   English   中英

#define中的C ++ void cast和operator逗号

[英]C++ void cast and operator comma in a #define

我在阅读一些源代码时发现了这一点。

 #define MACRO(x)  if((void) 0, (x)); else some_func();

我不完全理解操作符逗号和void转换背后的原因。 这有可能是与宏观的保护,我知道(void)0有时被用来保护级联else在宏S,从而为if(...) then foo(); else (void)0 if(...) then foo(); else (void)0

为什么运算符逗号有什么想法?

编辑:我开始认为这与猫头鹰 (0,0)

我猜这个技巧用于防止用户在if条件中声明变量。 您可能知道,在C ++中,这样做是合法的

if (int i = some_func()) {
   // you can use `i` here
}
else  {
   // and you can use `i` here
}

在该定义中使用逗号运算符将阻止宏使用

MACRO(int i = some_func());

并强制用户仅使用表达式作为参数。

那里的void转换肯定会阻止调用重载operator ,因为你不能使用void参数重载。 这保证了(void)0,没有效果。

为什么逗号运算符在那里? 一个好问题。 我真的不知道。

看起来好像有人可能已经开始使用包含assert一些代码,对其进行预处理,并将结果转换为宏。 当定义NDEBUGassert必须变成几乎没有 - 但是,从语法上讲,仍然必须产生一些占位符代码。 例如,您可以在以下情况下使用它:

assert(x), *x = 1;

当您使用NDEBUG定义编译它时,它仍然需要编译,但assert不应该做任何事情。 为了支持这一点, assert通常定义如下:

#undef assert
#ifdef NDEBUG
#define assert(x) ((void)0)
#else
#define assert(x) ((!!x) || __failassert(x, __FILE__, __LINE__))
#endif 

所以,如果某人开始使用上面的代码,然后查看预处理版本(定义了NDEBUG),他们会看到类似的内容:

((void *)0), *x = 1;

......如果他们不能很好地理解代码,他们可能会认为((void)0)真正意味着/完成了某些事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM