首页 > 其他分享 >__weak关键字和__attribute__ --20240225

__weak关键字和__attribute__ --20240225

时间:2024-02-25 23:33:12浏览次数:32  
标签:__ struct -- attribute section weak irq

__weak关键字 __weak是一个c/c++编译器关键字,用于定义一个弱化符号。弱化符号是一种在链接阶段可以被覆盖的符号,允许多个同名符号存在于不同的目标文件中,而不会产生冲突。   当一个符号被声明为__weak时,它具有两个特性: 1、如果该符号在某个目标文件中被定义,那么这个定义将成为默认实现,并且可以在链接器阶段被覆盖 2、如果该符号在某个目标文件中未被定义,则该符号的默认实现将为NULL   __weak和__attribute__((weak))都是定义弱化符号的关键字或属性,作用一致 在GCC编译器中,__weak是一个预定义的关键字,用于标记弱化符号。而__attribuate__((weak))是一种编译器特性,可以通过编译器属性来指示一个符号为弱化符号   简单示例代码:

// weak.c
#include <stdio.h>

// 定义一个弱化的全局变量
int __attribute__((weak)) weak_variable = 10;

// 定义一个弱化的函数
void __attribute__((weak)) weak_function() {
    printf("Default implementation of weak_function\n");
}

int main() {
    // 使用弱化的全局变量
    printf("Weak variable: %d\n", weak_variable);

    // 调用弱化的函数
    weak_function();

    return 0;
}

// weak2.c
#include <stdio.h>

int weak_variable = 20;

void weak_function() {
    printf("weak2 implementation of weak_function\n");
}

gcc -o weak weak.c weak2.c
./weak

执行结果如下:
Weak variable: 20
weak2 implementation of weak_function

 

__attribute__ 

__attribute__可以用来指示执行特定的操作或者进行优化,一些常见的用法如下: 1、attribute((aligned(n))):指示编译器将变量或者类型对齐到n字节
#include <stdio.h>

struct align_struct {
    int a;
    char b;
} __attribute__((aligned(8)));

int main() {
    printf("Size of struct align_struct: %zu bytes\n", sizeof(struct align_struct));
    return 0;
}

运行结果:
Size of struct align_struct: 8 bytes
2、attribute((packed)):指示编译器不要增加结构体成员之间的任何填充字节,以节省空间
#include <stdio.h>

struct my_struct {
    int a;
    char b;
} __attribute__((packed));


int main() {
    printf("Size of struct my_struct: %zu bytes\n", sizeof(struct my_struct));
    return 0;
}

运行结果:
Size of struct my_struct: 5 bytes
  3、attribute((section("name"))):可以将函数或变量放置到指定的段(section)中 如:
#define IRQ_DEFINE(__IrqId, __IrqHandle, __arg, __IrqName, __IrqFlags)        \
        __attribute__((section(".section_irq_table"))) struct irq_handler_struct   \
                _section_item_##__IrqId##_tlb = {                              \
                        .irqid = __IrqId,                                      \
                        .handler = __IrqHandle,                            \
                        .arg = __arg,                                        \
                        .irqname = __IrqName,                                  \
                        .irqflags = __IrqFlags,                                \
                }
在链接脚本中:
        . = ALIGN(8);
        .irq_table : {
                __section_irq_table_start = .;
                KEEP(*(SORT(.section_irq_table*)));
                __section_irq_table_end = .;
        }
此链接脚本的作用是将名为“.section_irq_table”的输入段中的内容与符号进行关联,并将它们放置到一个名为 ".irq_table" 的输出段中,并且确保其中的内容按地址顺序排列。同时,也定义了符号 __section_irq_table_start和 __section_irq_table_end,用于获取 ".section_irq_table" 段的起始和结束位置。   4、attribute((unused)):告诉编译器一个变量或者函数未被使用,避免编译器发出未使用变量或函数的警告  

标签:__,struct,--,attribute,section,weak,irq
From: https://www.cnblogs.com/lethe1203/p/18033349

相关文章

  • ssts-hospital-web-master项目实战记录十六:项目迁移-模块实现(page-info)
    记录时间:2024-02-25二、page-info模块实现framework/page-info/index.ts//javascript用来遍历指定对象所有的属性名称和值//obj需要遍历的对象constallProps=function(obj:any,props:string=''):string{ //使用Object.keys()获取对象自身的所有属性键 ......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1923。为唐氏儿的寒假带来了一个构式的结局,飞舞一个。天使骚骚不太行啊妈的,推了三条线了感觉剧情太白开水了,咖啡馆也是这个熊样子、、、A签到。显然最优的策略是不断地选择最右侧的1进行操作,每......
  • linux动态库和静态库 --20240225
    设计库的目的1)程序更加简洁,不需要维护太多的源文件2)保护三方厂商的知识产权gcc常用指令复习一波gcc的常用指令:-E:仅执行预处理(不要编译、汇编或链接)。-S:只编译(不汇编或链接)。-c:编译和汇编,但不链接。-o<file>:指定输出文件。-pie:创建一个动态链接、位置无关的可执行文件......
  • extern、const、register、static、inline关键字 --20240225
    extern关键字extern关键字有两种用法:1、用于声明一个全局变量或函数的外部链接性2、extern"C"是一个语言特性,用于告诉编译器按照C语言的方式对待指定的代码块,以确保与C语言兼容 用法一:用于声明一个全局变量或函数的外部链接性//file1.c#include<stdio.h>intn......
  • 23 design patterns
    ///-----------------23个设计模式是7个原则的具体形式,7原则是23个模式的凝练------------------//////-----------------target:高内聚、低耦合------------------///1.软件设计模式结构类比就是结构class或者是结构体行为类比class里面的函数创造的话,是构造出结构,让......
  • filter拦截与放行
    @WebFilter(urlPatterns="/*")publicclassLoginChechedFilterimplementsFilter{//拦截方法,只要资源链接被拦截就会触发此方法@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIO......
  • 完整登录功能实现
    1、导入pom.xml依赖<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency></dependencies>2、生成和解析令牌类的书写privatestatic......
  • ssts-hospital-web-master项目实战记录十四:项目迁移-模块实现(log-local)
    记录时间:2024-02-25一、log-local模块实现framework/config/index.ts//终端日志文件配置constLogTerminalInfoDir='D:\\LogInfo\\LogTerminalInfo\\'constLogTerminalInfoFileNamePrefix='LogTerminalInfo'//错误页面快照文件配置constLogErrorPageSnapshotFil......
  • 【Python】conda基本使用、pip换源、pip超时问题解决
    conda问题往期笔记conda安装:https://www.cnblogs.com/mllt/p/Anaconda-install.htmlconda基础操作https://www.cnblogs.com/mllt/p/jqsj_base_000.html创建环境命令行创建环境的方式见上文“conda基础操作”后面的链接文章。在此演示的是使用pycharm创建conda虚拟环境......
  • 学习记录
    三、进行部署1.安装Nginx软件商店-搜索Nginx-进行安装2.Nginx配置软件商店-已安装-Nginx-设置-配置修改62行的listen888;为监听888端口65行root/www/server/phpmyadmin;表示在此路径下去寻找将62行的listen888改为80将64行的index.html改为combine.html,因为一会儿要上传的网页......