我是靠谱客的博主 开放小伙,最近开发中收集的这篇文章主要介绍GCC弱符号的一个应用示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

GCC对C/C++做了很多扩展,很多基于Linux环境的开源项目都会使用。本文介绍一下弱符号的应用。

对于大型项目特别是兼容多种平台的项目来说,同一功能的实现会区别于不同平台,比如linux内核,比如coreboot。有的平台可能没有该功能接口,但顶层调用会使用到这个接口,为了不使链接出错,往往就使用到弱符号来解决。使用弱符号函数时,假如此项目工程没有其它同名的函数(可以认为是“强符号”),则调用该函数;如果其它文件也实现了同一名称函数,则调用其它文件的实现函数。

弱符号链接使用很简单,在函数实现加上“__attribute__ ((weak)) ”即可。对于调用者来说没有任何区别。下面的示例中,声明了一个名叫foobar,foodummy.c中是弱符号的实现,foo.c是“强符号”的实现,在main.cpp中调用foobar函数。同时将这3个文件编译,并不会出错,执行结果是打印foo.c中的函数。如果只编译main.cpp和foodummy.c,则会调用到foodummy.c的函数。

注:将doodummy.c的weak属性去掉,编译3个文件,编译器报重定义错误。


头文件声明foo.h:

#ifndef FOO_H
#define FOO_H


#ifdef __cplusplus
extern "C" {
#endif


void foobar(void);


#ifdef __cplusplus
}
#endif


#endif // FOO_H


弱符号链接实现文件dummyfoo.c:

#include "foo.h"
#include <stdio.h>


// 弱链接,外部没有实现时,则调用此处函数
void __attribute__ ((weak)) foobar(void)
{
    printf("dummy foobar...n");
}


真正实现文件foo.cpp:

#include "foo.h"
#include <stdio.h>


void foobar(void)
{
    printf("realy......n");
}


主函数main.cpp:

#include "foo.h"


#include <stdio.h>


int main(void)
{
    printf("test of weak link......n");
    foobar();
    
    return 0;
}


后记:实际工作中需要使用一套驱动上层接口的库,这套使用用于不同的SOC,不同的业务程序,对外提供的接口形式不变,所有产品可能都有LED灯,但有的产品没有RS485,有的产品没有FLASH,有的产品没有CPLD,等等。如果不希望这套库为每个产品都重新整理一遍所有接口,在此情况下,weak属性将发挥其强大功能。所有接口都有对应的weak的实现,但对于具体的产品,如果没有某一模块,删除其实现,由于存在weak的实现,不会出现找不到函数定义的错误,只需关注真正需要使用的部分接口即可。

李迟 2016.2.29 周一 晚


最后

以上就是开放小伙为你收集整理的GCC弱符号的一个应用示例的全部内容,希望文章能够帮你解决GCC弱符号的一个应用示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部