zhang0352505 发表于 2024-3-30 11:10:21

如何才能不影响原函数,但是又包含原函数?

我想定义一个函数,这个函数和已有的函数同名字,编译无法通过。
但是呢,我想在不更换这个函数名字的前提下,让调用原函数的地方,直接调用我的函数,
然后在我的函数中再去调用原函数。
是不是有些绕?
好,举个例子。
原函数名字叫_txe_block_allocate,我新建个函数也叫这个名字,然后我在当前我新建的函数中
调用了一个_txe_block_allocate_orig,然后在我的内部.c文件中定义 extern UINT _txe_block_allocate_orig;
在外面的.h文件中让#pragma weak _txe_block_allocate_orig=_txe_block_allocate
感觉有些混乱,但是我是这么理解的。因为这就是trace alyzer源码这么干的,现在编译不过了,哪位大神给解决一下:'(
我把源码传上来。

庄永 发表于 2024-3-30 13:56:07

你直接屏蔽原来的函数实现重新实现不行吗?还是有什么新的需求

2360985396 发表于 2024-3-30 14:06:29

你用宏定义也ok吧#pragma weak _txe_block_allocate_orig=_txe_block_allocate 好像不太行?

Edmund1964 发表于 2024-3-30 15:43:49

我记得是在函数前加static, 就只有同文件的函数能调用它,而且不同文件可以有同各的函数,你试试吧
如果说不行,就用宏把文件名称连接到函数名, 这看起来就等于同名的函数。

李益达 发表于 2024-3-30 21:28:36

手动修改链接文件即可。

emwin 发表于 2024-4-1 10:46:04

#pragma weak symbol1 = symbol2
This pragma declares symbol1 to be a weak alias of symbol2. It is an error if symbol2 is not defined in the current translation unit.

好问题,用"#pragma weak symbol1 = symbol2"应该是可以满足你的需求,它允许你灵活控制链接不同的函数。

雷鹏 发表于 2024-4-1 10:51:34

可以把原函数用 weak 定义成弱函数

glory 发表于 2024-4-1 10:59:25

老生常谈的问题,参考:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=123362&extra=

glory 发表于 2024-4-1 11:03:14

本帖最后由 glory 于 2024-4-1 11:05 编辑

总结起来就是,keil用$Super$$ 和 $Sub$$,
extern void ExtraFunc(void);
extern void $Super$$foo(void);
/* this function is called instead of the original foo() */
void $Sub$$foo(void){
ExtraFunc();    /* does some extra setup work */
$Super$$foo();/* calls the original foo() function */
                  /* To avoid calling the original foo() function
                   * omit the $Super$$foo(); function call.                   */
}
gcc 用__wrap 和 __real(并且用--wrap选项指定symbol),
void* __wrap_malloc(size_t size)
{
      fprintf(stdout, "call __wrap_malloc function, size: %d\n", size);
      return __real_malloc(size);
}


zhang0352505 发表于 2024-4-1 11:39:53

glory 发表于 2024-4-1 11:03
总结起来就是,keil用$Super$$ 和 $Sub$$,
extern void ExtraFunc(void);
extern v ...

大神,iar呢?我看iar里对gcc的支持,没有wrap的支持:'(

glory 发表于 2024-4-5 12:30:05

zhang0352505 发表于 2024-4-1 11:39
大神,iar呢?我看iar里对gcc的支持,没有wrap的支持

IAR目前没有这个功能

zhang0352505 发表于 2024-4-7 09:42:50

glory 发表于 2024-4-5 12:30
IAR目前没有这个功能

好吧,多谢
页: [1]
查看完整版本: 如何才能不影响原函数,但是又包含原函数?