首页
社区
课程
招聘
[讨论]一个奇怪的问题:如果有函数名相同,如何取到正确的地址?
发表于: 2014-9-18 15:15 7552

[讨论]一个奇怪的问题:如果有函数名相同,如何取到正确的地址?

2014-9-18 15:15
7552
如果有时候需要取函数地址
但c++里有可同名不同参数
如果存在这种函数时,如何取到某个地址?
语法让应该怎么写?

纯粹技术讨论,所以别告诉我把函数名改掉之类的方法

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
后面不带圆括号的函数名就是地址啊,如果函数名后面紧跟着圆括号就是函数调用了
2014-9-18 15:19
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我的意思是同名函数:
int Add(int a, int b)
float Add(float a, float b)

这2个函数写在一起,请你取第二个函数的地址
2014-9-18 15:36
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
这个问题还真没考虑过0.0
要不整个命名空间?
2014-9-18 15:44
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
你太蠢了  你导出一下  用工具查看一下 不就出来了
2014-9-18 15:48
0
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
搜索“C++名称修饰”。
但不同的编译器,甚至同一个编译器的不同版本的修饰方法都一定是相同的,所以导出C++接口的建议使用COM方式。
2014-9-18 15:49
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
用函数指针
2014-9-18 15:55
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
我真不认为你这是啥好办法
为啥你调用 函数时不也这么做呢?不嫌累?
2014-9-18 15:56
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
9
printf("%p\r\n", (int(*)(int,int))Add);
printf("%p\r\n", (float(*)(float,float))Add);
2014-9-18 15:57
0
雪    币: 446
活跃值: (758)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
aaaa
2014-9-18 16:02
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
貌似这才是真正的正确方法,谢谢
2014-9-18 16:49
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
晕死  我是要告诉你 你的函数 在编译器眼里是什么样形式,编译器是怎么区分的,所以 让你自己导出 看看
2014-9-18 16:57
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
你所谓的“函数名相同”,那也只是你的眼睛看到是相同的而已。
C++来说,那些在你看来名字完全相同的函数,编译好后,会是不同的名字

你的
int a(int param0,char parapm1);
void a(void*);
在C++里编译时,真实名字会被自动改成类似这样:

int $#a@8@43345

void #$a@455@0@54dfdf
2014-9-18 17:00
0
雪    币: 69
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
C++编译名称会杂糅,函数名不可能相的。
2014-9-18 17:03
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
你说的符号我知道一些,但那个太复杂,可用性不高,所以,我只是想看直接在代码里如何找到它嘛,

如果9楼说的是对的,他那样就是我想找的方法
2014-9-18 17:22
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
你说的是编译后的事,我讨论的是代码如何写,这是编译前的事

正如我前面说的,你调用 add的方法,完全不用关心它编译后产生的多么复杂的名称
我只是想找到类似的方法,直接取到它的地址
2014-9-18 17:24
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
名称改编的嘛。其实对链接器来说,你看到的func1在它那儿多半根本就不是这样
哦,原来你问的是编译前啊,那样的话名字相同就代表参数肯定不同,就是不同的类型,用函数指针呗。
2014-9-18 17:39
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
9楼不是说应该按下面这样写吗?
printf("%p\r\n", (int(*)(int,int))Add);
printf("%p\r\n", (float(*)(float,float))Add);

如果你写的是printf("%p\r\n", Add);
估计编译器会报错,然后你会发现错了,你就会按照上面的方法改写成正确的语法。
2014-9-18 18:07
0
雪    币: 38
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
9l的写法不是强制类型转换了吗?
2014-9-18 18:35
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
如果是导出hint会不同。但Name会相同。INT表已经做出规定。PE内是不会乱的,如果只是单纯的取地址,定义指针函数即可。
2014-9-21 03:01
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
任何代码,在编译之前就不存在一丁点程序意义上的“地址”
你所谓的“编译前的的地址”,只在你的想象中。。。。程序来说,这样的地址是不存在的。

C++所谓的可以函数重名,那也仅仅存在于“没编译前的、人眼看到的”而已
对编译器来说,他们完全就没有任何相同的地方,所以不存在你所谓的“如何能确定究竟是哪个函数”的问题。。。。不同的两个函数当然不会有干扰的地方
2014-9-21 20:48
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
我表示你真的是想多了

我当然知道不同的函数有不同的地址,我重点是要解决在C++这个层面的写法问题
我只是想表明,同名函数不好取址,这个所谓的地址,是通俗意义上的,大家可理解的那个,就像取变量地址一样的
2014-9-22 14:26
0
游客
登录 | 注册 方可回帖
返回
//