__attribute__ ((constructor))和__attribute__ ((destructor))用法

news2024/12/23 8:14:05

目录

1. 前言       

2. __attribute__介绍

3. 测试代码

4. 总结


1. 前言       

       最近看代码,有个函数根本就没被任何函数调用,但从程序运行结果来看,该函数是被调用了的,找很久都没找到哪里调用了,最后发现该函数前面用__attribute__((constructor))修饰,如下:

__attribute__((constructor)) void load_file()
{
    printf("Constructor is called.\n");
    g_count = (int *)malloc(sizeof(int));
}

2. __attribute__介绍

       __attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。

__attribute__语法格式为:__attribute__ ( ( attribute-list ) )  函数定义

如果函数被设定为constructor属性,则该函数会在main()函数执行之前被自动的执行;若函数被设定为destructor属性,则该函数会在main()函数执行之后或者exit()被调用后被自动的执行。

3. 测试代码

#include <stdio.h>  
__attribute__((constructor)) void load_file()
{
    printf("Constructor is called.\n");
}
 
__attribute__((constructor(100))) void load_file1()
{
    printf("Constructor 100 is called.\n");
}
 
__attribute__((constructor(102))) void load_file2()
{
    printf("Constructor 102 is called.\n");
}
 
__attribute__((constructor(99))) void load_file3()
{
    printf("Constructor 99 is called.\n");
}
 
 
__attribute__((destructor)) void unload_file()
{
    printf("destructor is called.\n");
}
  
int main(int argc, char **argv)  
{  
    printf("this is function %s\n", __func__);  
    return 0;  
}  

执行结果如下:

 

只有constructor有优先级,指定优先级时,先执行优先级小的,再执行优先级大的,最后执行没有指定优先级。0-100是保留优先级。 

       另外在升级接口时,希望用户使用新接口,而不希望用户再使用原来的旧接口,可以利用类似如下的机制提示用户,当用户在自己的项目使用旧接口时,编译器就会发出警告,提示旧接口已经废弃:

__attribute__((deprecated("该方法已废弃,不建议使用"))) void load_file4()
{

}

int main(int argc, char **argv)
{
    load_file4();
    return 0;
}

4. 总结

  • attribute((constructor)) 先于main()函数调用,attribute((destructor)) 在main()函数后调用
  • 只有constructor有优先级,指定优先级时,先执行优先级小的,再执行优先级大的,最后执行没有指定优先级。0-100是保留优先级。
  • 可以利用attribute和deprecated对不建议使用或废弃的接口进行说明。

注意:attribute((constructor)) 、attribute((destructor))功能仅仅适用于GNU的gcc编译器,在  MSVC编译器中使用会编译报错,提示不支持。

参考链接:

【1】:https://blog.csdn.net/m0_51139226/article/details/126457719

【2】:https://cloud.tencent.com/developer/article/2008172

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/861839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java顺序表解析与应用

一、顺序表概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 二、主要功能接口实现 Java顺序表底层就是一个动态数组。其主要功能接口如下&#xff1a; // 1.打印顺序表&#xff0…

stack(栈)和queue(队列)

目录 1.stack的介绍和使用(栈) 1.1 stack的介绍 1.2 stack的使用 1.3stack的模拟实现 2.queue的介绍和使用(队列) 2.1queue的介绍 2.3queue的模拟实现 3.priority_queue的介绍和使用 3.1priority_queue的介绍 3.2 priority_queue的使用 3.3priority_queue的模拟实现 …

高忆管理:碳酸锂期现货价格大幅回落 行业期盼找回“价格之锚”

6月末以来&#xff0c;国内碳酸锂价格的反弹态势戛然而止&#xff0c;再度陷入接连跌落格式。现货方面&#xff0c;据上海钢联数据显现&#xff0c;电池级碳酸锂价格6月26日至今已接连22次下调&#xff0c;从31.50万元/吨下调至最新的25.60万元/吨&#xff1b;期货方面&#xf…

【问题解决】Git命令行常见error及其解决方法

以下是我一段时间没有使用xshell&#xff0c;然后用git命令行遇到的一些系列错误和他们的解决方法 遇到了这个报错&#xff1a; fatal: Not a git repository (or any of the parent directories): .git 我查阅一些博客和资料&#xff0c;可以解决的方式&#xff1a; git in…

MyBatis操作数据库常见用法总结2

文章目录 1.动态SQL使用什么是动态sql为什么用动态sql标签拼接标签拼接标签拼接标签拼接标签拼接 补充1&#xff1a;resultType和resultMap补充2&#xff1a;后端开发中单元测试工具使用&#xff08;Junit框架&#xff09; 1.动态SQL使用 以insert标签为例 什么是动态sql 是…

vue3+vite使用vite-plugin-svg-icons

使用vite-plugin-svg-icons插件显示本地svg图标 在开发项目的时候&#xff0c;经常会用到svg矢量图标&#xff0c;而且我们使用svg以后&#xff0c;页面上加载的不再是图片资源&#xff0c;这对页面性能来说是个很大的提升&#xff0c;而且我们svg文件比img要小很多&#xff0c…

使用xrdp协议远程桌面控制树莓派,无需公网IP!

远程桌面控制树莓派&#xff0c;我们可以用xrdp协议来实现&#xff0c;它内部使用的是windows远程桌面的协议。我们只需要在树莓派上安装xrdp&#xff0c;就可以在同个局域网下远程桌面控制树莓派。 而如果需要在公网下远程桌面控制树莓派&#xff0c;可以通过cpolar内网穿透&…

Linux固件子系统的实现机制简介

一、Linux固件子系统概述 固件是硬件设备自身执行的一段程序。固件一般存放在设备flash内。而出于成本和便利性的考虑&#xff0c;通常是先将硬件设备的运行程序打包为一个特定格式的固件文件&#xff0c;存储到终端系统内&#xff0c;通过终端系统给硬件设备进行升级。Linux内…

self-attention(自注意力机制)

先举个有趣的例子理解 Q 、 K 、 V Q、K、V Q、K、V&#xff1a; 将我们要查询的内容&#xff0c;和商品列表进行相似度匹配&#xff0c;先拿出相似度更高的商品列表。 再根据以往的评价&#xff0c;计算出总分&#xff0c;按照分数进行排序。 self-attention d k \sqrt{d_k}…

ubuntu 安装 python

ubuntu 安装 python 初环境与设备查询是否安装安装python 本篇文章将介绍ubuntu 安装 python 初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统&#xff1a;ubuntu 查询是否安装 因为系统也许会自带一个python&#xff0c;所以验证一下&#xff0c;如果自…

Linux mysql5.7开启 binlog

查看 mysql是否开启 binlog。 查看命令&#xff1a; show variables like %log_bin%; log_bin OFF 是关闭的状态。 编辑my.cnf配置文件 vim /etc/my.cnf 默认的配置文件内容&#xff1a; 增加下面内容 server_id 1 binlog_format ROW log-bin mysql_log_bin 重启mysq…

uniapp 微信小程序 订阅消息

第一步&#xff0c;需要先去小程序官方挑选一下订阅模板拿到模板id 订阅按钮在头部导航上&#xff0c;所以 <u-navbar :bgColor"bgColor"><view class"u-nav-slot" slot"left" click"goSubscribe"><image :src"g…

【Java】try|catch|throws 具体详解+应用

目录 tryCatch 基本介绍 使用细节 throws异常处理 基本介绍 ​ 使用细节 自定义异常 基本概念 步骤 throw和throws的区别 tryCatch 基本介绍 使用细节 throws异常处理 基本介绍 使用细节 自定义异常 基本概念 步骤 throw和throws的区别

常见的软件项目质量管理5种方法

产品质量的重要性不言而喻&#xff0c;为了确保项目质量&#xff0c;我们需要快速高效地找出影响产品质量的因素。如果不能及时高效洞察影响因素&#xff0c;无法及时修复项目缺陷和Bug&#xff0c;往往会对项目造成意想不到的后果和风险&#xff0c;如需求变更、重要开发节点延…

【雕爷学编程】Arduino动手做(201)---行空板开发环境之Jupyter

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

数据库运维是什么意思?主要工作包含哪些?

还有不少小伙伴不知道数据库运维是什么意思&#xff1f;主要工作内容包含哪些&#xff1f;今天我们就一起来简单了解一下吧&#xff0c;仅供参考哦&#xff01; 数据库运维是什么意思&#xff1f; 数据库运维是指对数据库系统进行管理、监控和维护的过程&#xff0c;以确保数据…

CMU 15-445 -- Introduction to Distributed Databases - 19

CMU 15-445 -- Introduction to Distributed Databases - 19 引言System ArchitectureShared MemoryShared DiskShared Nothing Early Distributed Database SystemsDesign IssuesHomogeneous VS. Heterogeneous Database PartitioningNaive Table PartitioningHorizontal Part…

第一章 SpringBoot入门

1.SpringBoot简介 1.1.简介 Spring Boot来简化spring应用开发&#xff0c;约定大于配置去繁从简&#xff0c;just run就能创建一个独立的&#xff0c;产品级别的应用。 背景&#xff1a;J2EE笨重开发&#xff0c;繁多的配置、低下开发效率、复杂的部署流程、第三方技…

出现raise NotImplementedError报错

在学习《动手学深度学习》时&#xff0c;实现下面代码时&#xff0c;报出raise NotImplementedError错误。 import collections import torch from d2l import torch as d2l import math from torch import nnclass Seq2SeqEncoder(d2l.Encoder):def __init__(self,vocab_size,…

并发编程面试题2

并发编程面试题2 一、AQS高频问题&#xff1a; 1.1 AQS是什么&#xff1f; AQS就是一个抽象队列同步器&#xff0c;abstract queued sychronizer&#xff0c;本质就是一个抽象类。 AQS中有一个核心属性state&#xff0c;其次还有一个双向链表以及一个单项链表。 首先state…