函数指针在C与C++中的不同

rickys2080 2012-08-31 04:19:16
下面的程序:

#include <stdio.h>

int fun()
{
printf("fun runing\n");
}

int main(int argc, char *argv[])
{
void *pf;

pf=fun;
((int(*)())pf)();

return 0;
}

第12行pf=fun;在C++下编译报错[Error] pfun.cpp:12: error: invalid conversion from `int (*)()' to `void*'
而在C下(后缀名改为.c)却正确运行。
请大虾解释一下:C和C++对这种指针的不同要求是啥?
...全文
230 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rickys2080 2012-09-03
  • 打赏
  • 举报
回复
感谢楼上诸位,明白了!
学习了!
庄鱼 2012-08-31
  • 打赏
  • 举报
回复
在C++里,除了衍生类指针向基类赋值不需要显式转换外,其他的指针转换必须显示转换,此外C++不再接受句柄概念,因此指针匹配必须满足相容原则,否则将报错,即便其地址相同也必须如此。
mujiok2003 2012-08-31
  • 打赏
  • 举报
回复
ISO C++ forbids casting between pointer-to-function and pointer-to-object
mujiok2003 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
下面的程序:
C/C++ code

#include <stdio.h>

int fun()
{
printf("fun runing\n");
}

int main(int argc, char *argv[])
{
void *pf;

pf=fun;
((int(*)())pf)();

return 0;
}


第12行……
[/Quote]

C++ 2003 标准4.10.2:

An rvalue of type “pointer tocv T,” where T is an object type, can be converted to an rvalue of type
“pointer tocvvoid.” The result of converting a “pointer to cv T” to a “pointer tocvvoid” points to the
start of the storage location where the object of typeTresides, as if the object is a most derived object (1.8)
of typeT(that is, not a base class subobject).


指向对象类型的指针可以隐式转换为void*。 但是函数不算是对象类型, 所以不可以。

可以参考这个讨论。
rickys2080 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

c++有更严格的检查
明显不匹配嘛
[/Quote]
但是,楼上两位,void*类型的指针不是可以接受任何类型的赋值吗?
xiakeliangjian 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
c++有更严格的检查
明显不匹配嘛
[/Quote]
+
baichi4141 2012-08-31
  • 打赏
  • 举报
回复
C++对变量类型的检查比C严的多
ouyh12345 2012-08-31
  • 打赏
  • 举报
回复
c++有更严格的检查
明显不匹配嘛

64,654

社区成员

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

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