C语言一个函数能不能有两个名字?

文摘   科技   2023-12-19 08:36   广东  
最近有位哥问我,如何给C语言中的函数定义两个不同的名字?就是这两个名字都是指向同一个函数,同一个地址,而且两个名字都可以当做函数来用的那种。
我想都没想说,宏定义可以么?
他摇摇头,说不是这种。
我接着说,指针可以么?
他还是摇头……
他看我有点不耐烦,接着说,用宏定义总是觉得是伪造的函数,宏函数也终究不是函数,有些场合也替代不了函数。例如
// code.cvoid code_fxck(int times){  // balabala...}
// code_gen.h#define code_shxt code_fxckextern void code_shxt(int times);
上面的代码,code_gen.h如果是工具软件生成的,很可能就没有#define code_shxt code_fxck这个定义,就会出现编译出错。
他继续说,用函数指针吧,他们本身的地址是不一样的,即指针的地址和函数的地址不是同一个。例如:
// code.cvoid code_fxck(int times){  // balabala...}const // code_run.cconst void (*code_shxt)(int) =  code_fxck;
&code_fxck&code_shxt是不一样的。
我说,那定义两个功能一样的函数吧。
// code.cvoid code_fxck(int times){  // balabala...}void code_shxt(int times){  // balabala...}
他说这两个函数不在同一个地址空间,而且增加代码量了,万一这是一个超大的函数呢……
我发现他发挥他的专长——杠起来了!
我心想,尼玛,我就不信治不了你了!
那就用汇编吧
/* code.asm */ .thumb .thumb_func.globl code_fxck.globl code_shxtcode_shxt:code_fxck:  /* balabala...*/
他说,汇编太麻烦了,写起来效率很低……
我再出一招,用链接符号吧
// code.cvoid  __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))} > FLASHcode_shxt  = _code_shxt;
我继续解释着,这里code_shxtcode_fxck就是同一个地址了,怎样?
他还要杠,用字段来限制,好像不是很自由,而且不同环境用的链接脚本ld格式还不一样……
我X,要逼我出大招么,靠,老子今天就跟你杠到底!
// code.cvoid code_fxck(int times){  // balabala...}
void code_shxt(int times) __attribute__((alias("code_fxck")));
这行吗?!
他心里没底,有点不相信,放低了声调说,这……行吗?就算可以……那么如果编译器不支持这个__attribute__呢?
此时,我运起了丹田,一股劲,以排山倒海之势……


如果这个文章能对你有帮助,请点个赞👍🏻点个在看,感谢!
关注公众号“嵌入式软件实战派”,我给你分享更多面试知识和技巧。

如果你喜欢我的文章,请关注,并转发点赞在看,这是对我莫大的鼓励!

嵌入式软件实战派
专注嵌入式软件开发领域知识传授,包括C语言精粹,RTOS原理与使用,MCU驱动开发,AUTOSAR搭建,软件架构方法设计等