Typedef reinterpret_cast

Tho*_*mas -4 c++ casting typedef

我在弄清楚语法时遇到了一些麻烦typedef reinterpret_cast.有人可以帮忙吗?

编辑:

我想做什么.我总是犹豫不决,因为人们似乎总是陷入其他所有事情,除了问题实际上是什么,因为你可以看到我的上一篇文章导致一大堆什么都没有.

我试图想出一种为指针分配mem地址0的方法.我使用它作为安全捕获等.我认为typedef cast会对此有所帮助.请不要建议我使用NULL.

谢谢

Tyl*_*nry 5

我想我终于理解了你想要的东西,但我仍然不确定你为什么要这样,我怀疑你并不真的需要它.如果你告诉我们你的最终目标是什么,我们或许可以告诉你你真正需要什么.那说:

你似乎意识到了这一点

Foo* p = 0;
Run Code Online (Sandbox Code Playgroud)

被定义为设置p为空指针,其可能实际上可能由内存中的零位字符串实际表示.您似乎想要一种方法来确保指针占用的内存充满零位,而不是任何位模式表示空指针.

您可以通过以下两种方式执行此操作.最直接和正确的是:

Foo* p;
memset(&p, 0, sizeof(p));
Run Code Online (Sandbox Code Playgroud)

另一个,这似乎是你想到的reinterpret_cast,是这样的:

Foo* p;
int i = 0;
p = reinterpret_cast<Foo*>(i);
Run Code Online (Sandbox Code Playgroud)

这种方法的工作原理并p直接指定为零不是因为在分配给指针时,只有文字零被解释为空指针.i包含值零,但不是文字零.但是,当指针和整数的大小不同时,上述方法是错误的,因此更好的方法可能是:

Foo* p;
char c[sizeof(p)] = {0};
p = reinterpret_cast<Foo*>(c);
Run Code Online (Sandbox Code Playgroud)

但是,这仍然是不正确的,因为reinterpret_cast当您对所投射变量的实际类型撒谎时,访问a的结果是未定义的行为.c实际上并不是真的Foo*,所以这是未定义的行为.因此,您应该使用它memset来实现这一目标.

你似乎想要一个的原因typedef是你可以有一个指针类型,在创建时自动赋值0.不幸的是,这是不可能的.A typedef只能指定类型,而不能指定初始值.除了创建自己的智能指针类来执行此操作之外,您可以做的最好的事情是将调用包含memset在便利函数中,例如

template <typename T> T* zeroPointer() {
   T* p;
   memset(&p, 0, sizeof(p));
   return p;
}

Foo* p = zeroPointer<Foo>();
Run Code Online (Sandbox Code Playgroud)

现在,即使考虑到所有这些,在所有情况下,这仍然可能无法满足您的需求.正如GMan在他的评论中指出的那样,并不能保证指针在所有平台上都由数字表示,因此在此之后值p可能不是数字零,并且可能与系统上的地址 0 不对应,即使它全部为零-Bits.给定系统甚至可能不会这样的事,作为一个"地址0".例如,在特定系统上,指针可以由包含段地址和偏移的结构表示.

最后,请注意,您将不得不额外努力来测试此值.例如:

Foo* p = zeroPointer<Foo>();

if (p == 0) {
  // Not reached if NULL is not all-zero bits, since the literal 0 in the
  // comparison is interpreted as a null pointer constant
}
Run Code Online (Sandbox Code Playgroud)

你基本上必须单独检查每个位.在不调用未定义行为的情况下执行此操作的唯一方法是这样的:

template <typename T> bool isZero(T& p) 
{
   char c[sizeof(p)];
   memcpy(&c, &p, sizeof(p));
   for (int i = 0; i < sizeof(p); ++i) {
     if (c[i] != 0) return false;
   }
   return true;
}

Foo* p = zeroPointer<Foo>();

if (isZero(p)) {
  // Always reached
}
Run Code Online (Sandbox Code Playgroud)

这一切都非常繁琐,因为你在这里反对这种语言.该语言试图通过提供一种设置空指针的可移植方法来提供帮助,但是您希望避免这种情况,并出于某种原因构成您自己的全零位指针.这就是为什么我确信无论你最终想要做什么都可以通过其他方式完成,而不涉及与你编程的语言作斗争.