ARMCC中的特殊修补符号Super和Sub

前言

偶然在RTthread代码中发现,特殊的修补符号$Super$$ 和 $Sub$$,他的作用很强大,介绍一下。

实例代码

如下代码:

extern int $Super$$main(void);
/* re-define main function */
int $Sub$$main(void)
{
    rt_hw_interrupt_disable();
    rtthread_startup();
    return 0;
}

如上代码中,用符号 $Super$$ 和 $Sub$$ 修饰了原函数main();为原来不能修改的main()函数打了补丁,作用是在调用原来的main()函数前,先调用自己定义的$Sub$$main()函数。   

说明

在符号定义无法被修改的情况下,你可以用种特殊符号 $Super$$ 和 $Sub$$ 去为该符号定义打补丁。 例如,如果它位于外部库或ROM代码中。 在这种情况下,您可以使用 $Super$$ 和 $Sub$$ 模式来修补现有符号,修补函数的定义。

看下官方举的例子

foo():
$Super$$foo
标识原始未修补的函数foo(),用它来直接调用原始函数。
$Sub$$foo
标识调用的新函数而不是原始函数foo(),使用此选项可在原始函数之前或之后添加处理。
-----Note----- $Sub$$ 和 $Super$$ 机制仅适用于静态链接时,$Super$$引用无法导入或导出到动态符号表中。

详见参考手册:

前言 偶然在RTthread代码中发现,特殊的修补符号$Super$$ 和 $Sub$$,他的作用很强大,介绍一下。 实例代码 如下代码: extern int $Super$$main(void); /* re-define main function */ int $Sub$$main(void) { rt_hw_interrupt_disable(); rtthread_startup(); return 0; } 如上代码中,用符号 $Super$$ 和 $Sub$$ 修饰了原函数main();为原来不能修改的main()函数打了补丁,作用是在调用原来的main()函数前,先调用自己定义的$Sub$$main()函数。    说明 在符号定义无法被修改的情况下,你可以用种特殊符号 $Super$$ 和 $Sub$$ 去为该符号定义打补丁。 例如,如果它位于外部库或ROM代码中。 在这种情况下,您可以使用 $Super$$ 和 $Sub$$ 模式来修补现有符号,修补函数的定义。 看下官方举的例子 foo(): $Super$$foo 标识原始未修补的函数foo(),用它来直接调用原始函数。 $Sub$$foo 标识调用的新函数而不是原始函数foo(),使用此选项可在原始函数之前或之后添加处理。 -----Note----- $Sub$$ 和 $Super$$ 机制仅适用于静态链接时,$Super$$引用无法导入或导出到动态符号表中。 详见参考手册:
经验分享 程序员 微信小程序 职场和发展