前言

今天无意之间看到了一个__weak类型函数,之前没有了解过,就查了一下资料。现在分享一下。

__weak是什么

含义解释

(1)其实这个用白话很好理解:__weak 表示弱定义,表示如果你自己定义了同名的函数就不用他,如果你没定义就使用这个弱函数。
(2)这个是属于C语言的中的一个关键字吗?不是的,__weak 关键字并不是标准的 C 语言关键字,它是一种特定编译器或环境提供的扩展。因此,使用 __weak 关键字时应当注意编译器和平台的兼容性,并确保正确的使用方式和语义。

代码解释

(1)在如下代码中,如果编译器承认__weak 关键字,那么最终执行结果是This is the weak foo function。
(2)但是如果编译器不承认__weak 关键字,那么就会进行报错。

#include <stdio.h>

__weak void foo() {
    printf("This is the weak foo function.\n");
}

void foo() {
    printf("This is the foo function.\n");
}

int main() {
    foo();  // 调用弱符号函数
    return 0;
}

这样做的好处

(1)在开发大型项目的时候,因为是多个人同时开发。不同模块之间,开发人员不知道对方的命名是什么。可能会出现,两个开发人员给不同的函数功能,起了一个相同的名字。这样就会导致程序运行出现故障,排查问题会很不方便。
(2)除了__weak类型函数,还有static修饰的函数。static修饰的函数具有强符号性,他的功能与__weak修饰的甘薯功能恰好相反,被static修饰的函数,具有优先调用的能力。但是需要注意的是,static修饰的函数,不能被其他.c文件所调用。