【发布时间】:2014-11-01 09:02:32
【问题描述】:
我在几个旧项目中看到过这样的代码:
class Class {
static void Method() {}
};
((Class*)0)->Method();
此代码包含未定义的行为,因为它包括取消引用空指针(无论之后发生什么)。这真的没有意义 - 转换是为了将类型名称提供给编译器,而编写上面代码的人可能已经编写了这个:
Class::Method();
后者也可以。
为什么有人会编写以前的代码?这是过去美好时光的成语还是什么?
【问题讨论】:
-
我怀疑这种东西来自可以与常规或静态方法一起使用的宏。
-
我不确定调用本身是否严格执行任何“取消引用”。虽然这可能发生在函数本身。
-
这有点像人们在添加到语言之前编写的
offsetof()宏中的假解引用。 -
这显然是一件坏事——我最好的猜测是,最初的
Method不是静态的(但没有访问任何实例数据)并且有人使用这个 hack 来调用它。后来有人意识到Method需要是静态的并对其进行了更改,但并未修复调用它的所有位置。 -
空指针 variable 与 this 一起使用更为常见。例如:VC++ DevCon 1999,DonBox 吹捧,
CComObject<YourClass>* pObj = NULL; HRESULT hr = pObj->CreateInstance(&pObj);“你知道你能做到,对吧?”好吧,read this 并决定你住在围栏的哪一边。很清楚唐在哪里闲逛。
标签: c++ pointers static-members undefined-behavior dereference