// code.c
void code_fxck(int times)
{
// balabala...
}
// code_gen.h
#define code_shxt code_fxck
extern void code_shxt(int times);
上面的代码,code_gen.h如果是工具软件生成的,很可能就没有#define code_shxt code_fxck这个定义,就会出现编译出错。
他继续说,用函数指针吧,他们本身的地址是不一样的,即指针的地址和函数的地址不是同一个。例如:
// code.c
void code_fxck(int times)
{
// balabala...
}
const
// code_run.c
const void (*code_shxt)(int) = code_fxck;
&code_fxck和&code_shxt是不一样的。
我说,那定义两个功能一样的函数吧。
// code.c
void code_fxck(int times)
{
// balabala...
}
void code_shxt(int times)
{
// balabala...
}
他说这两个函数不在同一个地址空间,而且增加代码量了,万一这是一个超大的函数呢……
我发现他发挥他的专长——杠起来了!
我心想,尼玛,我就不信治不了你了!
那就用汇编吧
/* code.asm */
.thumb
.thumb_func
.globl code_fxck
.globl code_shxt
code_shxt:
code_fxck:
/* balabala...*/
他说,汇编太麻烦了,写起来效率很低……
我再出一招,用链接符号吧
// code.c
void __attribute__((section (".YOUR_FXXK_CODE"))) code_fxck(int times)
{
// balabala...
}
/* fxxk_proj.ld */
/* ... */
.your_fxx_code : ALIGN(1024)
{
_code_shxt = ABSOLUTE(.);
KEEP(*(*.YOUR_FXXK_CODE))
} > FLASH
code_shxt = _code_shxt;
我继续解释着,这里的code_shxt和code_fxck就是同一个地址了,怎样?
他还要杠,用字段来限制,好像不是很自由,而且不同环境用的链接脚本ld格式还不一样……
我X,要逼我出大招么,靠,老子今天就跟你杠到底!
// code.c
void code_fxck(int times)
{
// balabala...
}
void code_shxt(int times) __attribute__((alias("code_fxck")));
这行吗?!
他心里没底,有点不相信,放低了声调说,这……行吗?就算可以……那么如果编译器不支持这个__attribute__呢?全部0条评论
快来发表一下你的评论吧 !