读书人

函数名字到底是什么?该如何解决

发布时间: 2012-02-13 17:20:26 作者: rapoo

函数名字到底是什么??


void f()
{
}

int main(int argc, char* argv[])
{
void (*p)();
p = f;
return 1;
}
设个断点 p 和f的值不一样,为什么???
:-)

[解决办法]
VC编译时加了一个符号_f,从_f开始的地方是跳转语句,跳转到真正的函数f, 给p赋值时给的是_f的地址
[解决办法]
打印的时候打印的是_f的值,在Watch里或鼠标tips显示的是f的值
----------------------------------
不是这样的吧?
将_f赋给P,cout < <hex < <p打印的是P的内容,即_f的地址,不是_f的值(_f的值应该是跳转语句的二进制代码吧,就看机器怎么编译与翻译了)

cout < <hex < <f; 为什么也是打印的和P一样的值,即_f的地址呢 我觉得是因为函数中f的引用实际上是引用f的副本(即编译成的_f),就像传进来的参数一样,都要做一分拷贝,引用其副本
比如: void fun(char *p){p=new char;}调用函数fun 后P是不会变的,只改变了其副本_P,但是P的指向没变(发生了内存泄露),而只能改变P所指向的地址的内容,这就是指针用于传地址

函数名就相当于函数地址(类似于数组名),而数组名做参数退化为指针,这样引用f就如同上面的P了(当然别去修改数组名地址)
[解决办法]
在debug下如果开了增量编译就是不一样的(vc默认是打开这个的)

这个时候

你看到f的地址是实际地址

p 是 ILT 表地址(一条跳转指令,跳到 实际地址)
[解决办法]
vc把p=f和p=&f都处理成p=&f了.
所以p和f不一样
[解决办法]
wengch() ( ) 信誉:100 2007-07-23 08:34:08 得分: 0
函数名去掉括号后就自动降级为函数如口地址了,无需加引用符号&.
这是函数指针的基础知识,查看一下C语言关于函数指针的基础知识.
----------------------------------------------
那是vc做的事吧 gcc貌似不会做这事 需要用&
[解决办法]

wengch() ( ) 信誉:100 2007-07-23 08:34:08 得分: 0
函数名去掉括号后就自动降级为函数如口地址了,无需加引用符号&.
这是函数指针的基础知识,查看一下C语言关于函数指针的基础知识.
----------------------------------------------
那是vc做的事吧 gcc貌似不会做这事 需要用&
================================================================
这是c标准规定滴~~~~
[解决办法]
另外说一下,你可以找个C编译器(注意,不是C++哦)
写个代码段如下:
int i;
int* p = &i;
试试可以编译过否.

读书人网 >C++

热点推荐