c++类型转换方式转不了?

pacman2000 2004-06-29 04:31:41
要从 void * 的指针类型转换成函数指针 int (*)() ,但是不管用static_cast还是reinterpret_cast编译都报错。。。

reinterpret_cast报错:
t.cpp:6: error: ISO C++ forbids casting between pointer-to-function and pointer-to-object

static_cast报错:
t.cpp:6: error: invalid static_cast from type `void*' to type `int (*)()'

非得用老式的C类型转换才行?还是gcc编译器的问题???
...全文
292 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingotom 2004-06-30
  • 打赏
  • 举报
回复
我的记忆中,c++中,任何指针都可以转换为void的,但void的不能转换为其它指针
学习一下
goodname 2004-06-30
  • 打赏
  • 举报
回复
vc.net 2003
是可以的

g++没测试过
qwertasdfg123 2004-06-30
  • 打赏
  • 举报
回复
在vc6是可以的。
g++不行。
pacman2000 2004-06-30
  • 打赏
  • 举报
回复
goodname(叶落知秋):
多谢你的程序,但是你的程序编译以后还是报错:
t.cpp: In function `int main()':
t.cpp:6: ANSI C++ forbids casting between pointers to functions and objects
t.cpp:7: ANSI C++ forbids casting between pointers to functions and objects

看来是g++本身的问题了。
你用的是什么编译器啊?用static_cast<>行吗?
goodname 2004-06-30
  • 打赏
  • 举报
回复
#include <stdio.h>
int f();

int main()
{
void *p=reinterpret_cast<void *>(f);
int (*pf)()=reinterpret_cast<int (*)()>(p);
printf("%d\n",pf());

return 0;
}

int f()
{
return 123;
}
goodname 2004-06-30
  • 打赏
  • 举报
回复
#include <stdio.h>
int f();

int main()
{
void *p=(void *)f;
//int (*pf)()=(int (*)())p;
printf("%d\n",((int (*)())p)());

return 0;
}

int f()
{
return 123;
}
sungengyu 2004-06-30
  • 打赏
  • 举报
回复
broown(broown) : 4325 只是我顺手写上去的,没什么意义 :P
唯一目的就是给 pv 一个初值,调试的时候 pfn 和 pv 比较时方便而已。

loveyou19840806(撒加) :看不懂的话,就不要乱讲。
楼主说“ 要从 void * 的指针类型转换成函数指针 int (*)() ”
如果用 C 的话,
*(int*)(&pfn) = (int)pv
就可以实现了 —— 既然 sizeof(void*),sizeof(int),sizeof(pfn) 都是 4 。

hxblvc 2004-06-29
  • 打赏
  • 举报
回复
从 void * 的指针类型转换成函数指针 int (*)()

这个啊,如果用C++的类型转应该是不行的,C++引入***_cast的目的就是为了安全,你这样做当然不行

做这种事还是C好!
janux 2004-06-29
  • 打赏
  • 举报
回复
void *pv = (void*)4325;怎么不可以,不就指向地址4325嘛。
你难道没用过void *p = NULL;吗?
loveyou19840806 2004-06-29
  • 打赏
  • 举报
回复
void *pv = (void*)4325,这样可以吗?4325又不是一个指针类型,

*(int*)(&pfn) = (int)pv 这句错得厉害,函数指针本来只能重新赋符合条件的值,而不能进行任何转换。再说这句不伦不类的,什么都不像

你为什么不能转换我就不知道了,但是在C语言中用malloc分配的时候全是把VOID *转换成你想的指针类型的
broown 2004-06-29
  • 打赏
  • 举报
回复
楼上的:void *pv = (void*)4325;是什么意思啊?
sungengyu 2004-06-29
  • 打赏
  • 举报
回复
void *pv = (void*)4325;
int (*pfn)() ;
//
*(int*)(&pfn) = (int)pv ;

// 这样行不 ?
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
vc6可以。
gcc不行。
pacman2000 2004-06-29
  • 打赏
  • 举报
回复
大家看看其他的编译器是不是可以的啊。。。
peter9606 2004-06-29
  • 打赏
  • 举报
回复
学习!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧