C ++无效演员和运营商逗号使用#define

我发现这个在阅读一些源代码。

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

我不完全理解背后的操作者逗号和空白投的原因。 这有可能是与宏观的保护,我知道(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());

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

虚空转换肯定是要防止调用过载的operator ,因为你不能用一个空参数超载。 这保证了(void)0,没有效果。

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

看起来有点好像有人可能已经开始与一些代码,其中包括一个assert ,预先处理它,并把结果放到一个宏。 当NDEBUG定义, assert已经变成几乎没有什么-但是,语法上,仍然有产生一些占位符码。 例如,你被允许使用它在这样的情况:

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)的真正含义/有所成就。

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,宏
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.881 (s). 10 q(s)