gpt4 book ai didi

c++ - reinterpret_cast to void* 不使用函数指针

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:57 26 4
gpt4 key购买 nike

我想重新解释将函数指针转换为 void* 变量。函数指针的类型将为 Class* (*)(void*)

下面是示例代码,

class Test
{
int a;
};

int main()
{
Test* *p(void **a);
void *f=reinterpret_cast<void*>(p);
}

以上代码适用于 Visual Studio/x86 编译器。但是使用 ARM 编译器,它会给出编译错误。不知道为什么。

Error: #694: reinterpret_cast cannot cast away const or other type qualifiers

我阅读了Casting a function pointer to another type中的解释

我担心下面的解释。

Casting between function pointers and regular pointers (e.g. casting a void
(*)(void)
to a void*). Function pointers aren't necessarily the same size as regular pointers, since on some architectures they might contain extra contextual information. This will probably work ok on x86, but remember that it's undefined behavior.

如何有效地从 void (*)(void*) -> void* 进行此类转换,以便至少它在大多数编译器中的编译几乎相同?

最佳答案

reinterpret_cast 不能用于将指向函数的指针转换为 void*。虽然还有一些 C 类型转换可以执行的其他操作是静态、重新解释和 const 类型转换的组合所不允许的,但转换不是其中之一。

在 C 中允许转换,但它的行为没有定义(即不能保证往返有效)。

一些 POSIX 函数需要转换才能很好用。

我在这里玩过几个编译器:

  • 没有阻止 C 转换,即使在最高一致性模式下也是如此。有些会根据警告和一致性级别发出警告,有些则无论我尝试什么都没有发出警告。
  • reinterpret_cast 对一些编译器来说是一个错误,即使在更宽松的级别上也是如此,而其他编译器在所有情况下都接受它而没有发出警告。

在 C++0X 的最新草案中,有条件地支持函数指针和对象指针之间的reinterpret_cast

请注意,这是否有意义将更多地取决于目标而不是编译器:像 gcc 这样的可移植编译器将具有目标体系结构和可能的 ABI 强加的行为。

正如其他人所说,

Test* *p(void **a);

定义一个函数,而不是指向函数的指针。但是函数指向函数指针的隐式转换是为reinterpret_cast的参数做的,所以reinterpret_cast得到的是一个Test** (*p)(void** a)

感谢 Richard 让我更深入地重新审视了这个问题(郑重声明,我错误地认为函数指针指向对象的指针是 C 强制转换允许某些未经 C++ 强制转换组合授权的情况) .

关于c++ - reinterpret_cast to void* 不使用函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1304736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com