C语言 : weak_alias描述

本文介绍了C/C++中weak-alias宏的作用及其使用方法。weak-alias宏用于为函数添加弱别名,当调用没有强符号对应时,会尝试调用弱别名对应的函数。文章通过实例演示了如何定义强符号与弱符号,并展示了编译和运行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

weak-alias

  • 是一个宏,其目的是为函数添加一个”弱”别名,与”强”符号函数名区分。
  • 说明, 如果调用函数无对应的函数无”强”符号对应的函数,则会调用该别名对应的函数
  • C/C++ 函数调用是以编译后的”符号”做索引调用,详情了解 <符号表>
//macro weak_alias
#define weak_alias(name, aliasname) _mweak_alias(name, aliasname)
#define _weak_alias(name, aliasname) \
extern __typeof(name) aliasname __attribute__((weak, alias(#name)));
//macro weak_alias end

  • 所谓”强”符号函数名就是,普通声明定义的函数对应的函数名
    例如:
//strong.c
#include <stdio.h>
void print_hello(const char *s)
{
printf("print_hello: %s\n", s);
}
//strong.c end

print_hello 就是一个”强”函数符号


以下测试两种情况

__weak_hello 有两个”弱符号”
print_hello 有对应的实体函数 而 print_world 则无
//weak.c
#include <stdio.h>
void print_hello(const char *s) __attribute__((weak, alias("__weak_hello")));
void print_world(const char *s) __attribute__((weak, alias("__weak_hello")));
void __weak_hello(const char *)
{
printf("__weak_hello: %s\n", s);
}
//weak.c end
//main.c
int main(void)
{
print_hello("main test print_hello");
print_world("main test print_world");
return 0;
}
//main.c end
  • 编译运行测试
    $ gcc strong.c weak.c main.c && ./a.out
    print_hello: main test print_hello
    __weak: main test print_world
    $
可见 当调用函数有对应的”强”符号,则调用,若无则会尝试寻找其”weak”对应的函数,若再无则编译会报错 找不到该函数

End

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值