- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想重新解释将函数指针转换为 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
to a
(*)(void)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++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/
我最近了解到 C++ 标准包含“严格的别名规则”,它禁止通过不同类型的变量引用相同的内存位置。 但是,该标准确实允许 char 类型合法地别名任何其他类型。这是否意味着 reinterpret_cas
我需要将一段代码从 C++ 转换为 VB6。 具体来说,这个: reinterpret_cast(reinterpret_cast(lParam)->hwndParent) 有人能告诉我这在 VB6
我正在编写与对齐相关的代码,如果给定的指针正确对齐,却没有标准的功能测试,这让我感到非常惊讶。 似乎互联网上的大多数代码都使用(long)ptr或 reinterpret_cast(ptr)测试对齐,
这个问题在这里已经有了答案: Why is reinterpret_cast not constexpr? (2 个答案) 关闭去年。 我遇到了以下错误: class NormalClass { p
我recently learned通过 reinterpret_casting 其地址将 POD 重新解释为不同的 POD 是未定义行为。所以我只是想知道 reinterpret_cast 的潜在用例
考虑以下程序: struct A{}; int main() { A a; A b = a; A c = reinterpret_cast(a); } 编译器 (g++14)
我recently learned通过 reinterpret_casting 其地址将 POD 重新解释为不同的 POD 是未定义行为。所以我只是想知道 reinterpret_cast 的潜在用例
它为什么会存在?在什么情况下它不会导致严格的别名违规,在哪些情况下会导致? 我的意思是,如果你在两个不兼容的类型之间进行转换,并且该转换的结果是唯一指向它在整个程序中使用的内存的指针,那么在假设没有其
这两个cast语句是一样的吗?它们产生相同的结果。 const std::int16_t i = 3; char a[ 2 ]; *reinterpret_cast(a) = i; reinterp
我已经编写了 MyString 和 MyStringConst 类。现在我需要不时地将 MyString 作为 MyStringConst 传递,因此重载强制转换运算符。这是我写的 MyString:
我有一个结构 S,它将两个类型为 T 的固定大小的数组打包在一起。 template struct S { array, 10> x1; array x2; }; 我想获取对大小为 2
如果我已将结构的成员复制到我的类中,我是否可以从我的类转换为结构? #include #include class Buffer { public: void * address;
#include struct A { int a; }; struct I1 : A { int a; }; struct I2 : A { int a; }; struct D : I1, I2
是否可以使用 reinterpret_cast 将 const 限定符仅添加到结构的一个成员。 #include std::pair test; std::pair& ctest = reinter
int main() { class_name object; object.method(); fstream file("writeobject.dat" , ios::o
当我注意到它的输出完全错误时,我正在测试一个简单的编译器。事实上,输出的字节顺序从小变大了。经过仔细检查,违规代码原来是这样的: const char *bp = reinterpret_cast(&
基本思想是创建一个可变大小的数组,在构造时固定,并在单个分配单元中创建另一个类,以减少开销并提高效率。分配缓冲区以适应数组,并使用另一个对象和新放置来构造它们。为了访问数组的元素和另一个对象,使用了指
#include struct I1 { virtual void nb1()=0; virtual ~I1(){} }; struct I2 { virtual void n
我刚刚在使用reinterpret_cast的代码中发现了一个错误,将其更改为dynamic_cast后,问题就消失了。然后,我尝试使用以下代码重现该行为: 1 #include 2 3
我想知道有没有一种不用大量复制就可以解决这个问题的好方法。 例如,假设我有一个字节缓冲区,我在其中保存了很多东西。我会正确地在其中保存 4 个字节的整数和 float 等。 现在,如果我的整数保存在缓
我是一名优秀的程序员,十分优秀!