| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4462 人关注过本帖
标题:如何实现函数替换呢?
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
呵呵,那你得探索一下宏的使用技巧~ 不是你这么写的。

一般函数体定义呀,头文件呀,和调用到它们的模块一般不是写一个文件里的吧~
那个替换写在头文件里就行了。

我说了这个办法可能也不是很好,我的灵感是这么来的:
GNU 旗下有很多开源工具的源码我看过不少,其中有的全局工具其实是 unix 的一些系统调用呀,GNU 库里的东西。GNU 为了增加工具的可移植性,让没有的这些系统调用的系统也能用,就自己实现了一个功能类似的函数。不过声明头里说里,如果你在类 UNIX 的系统下编译软件时,可以在 configure 时提供 --with-gnu-libc 参数,避免编译那些没用的 code,不过它主要是应用到 make 上。我当时就想类似的技术用到编译上也一样。


我当时举的那个例子是为了简单,才写在一起的。你如果写在头文件里,每个包含的文件就都会预处理。像你那么写,因为有顺序,所以在下面出现的替换上面是不会应用的。

还有另一个概念就是,我当时是希望调试的东西只在调试的时候生效,把 DEBUG 这个宏定义在环境里。当调试结束之后,去掉这个宏,再重新编译就可以得到发布版的程序。而不搀杂调试函数。
而我现在知道你是希望这两个函数能同时存在在。才会写类似
#define c1 c2
    c1.dump();
    test();
#undef c1
    c1.dump();
的代码。
我当时并没有考虑你既要调 f() 作为 f(),也要调 f() 作为 _f() 。所以我提供的那个办法可能根本行不通。
2010-08-03 02:06
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
怎么没见你的 条件预处理 有 #else ?

#define BGLIFETOTALSWITCH

#ifdef BGLIFETOTALSWITCH
    p->life = p->lifeTotal;
#else
    p->life = 10;
#endif

我就是真命天子,顺我者生,逆我者死!
2010-08-03 12:39
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 12楼 pangding
活干多了, 技巧自然就出来了。

。。。我不知道楼主说的是什么东西? 别被我误导了

[ 本帖最后由 BlueGuy 于 2010-8-3 12:50 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-08-03 12:42
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
unsigned * addr = (unsigned *)MessageBoxA;        
unsigned * myaddr = (unsigned *)MessageBoxProxy;


函数指针到底应该怎么定义?

这么基本的东西你都没搞懂。
2010-08-03 12:53
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
以下是引用Devil_W在2010-8-3 12:53:10的发言:

unsigned * addr = (unsigned *)MessageBoxA;         
unsigned * myaddr = (unsigned *)MessageBoxProxy;
 
函数指针到底应该怎么定义?
 
这么基本的东西你都没搞懂。
首先,非常感谢你这么仔细的看了我的代码实现
不过我这两句的目的,仅仅是想获取函数的入口地址而已,所以对指针的具体类型没有这么关注

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-03 23:16
小旬_C
Rank: 2
等 级:论坛游民
帖 子:72
专家分:33
注 册:2010-7-25
收藏
得分:0 
没事冒个泡

没有失败,只有暂时停止成功
2010-08-03 23:38
快速回复:如何实现函数替换呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021566 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved