C++ __attribute__((constructor))使用介绍

作者:令狐掌门
技术交流QQ群:675120140
csdn博客:https://mingshiqiang.blog.csdn.net


在 C++ 中,__attribute__((constructor)) 是一个 GCC 扩展(并非标准的 C++ 语法),用于指定一个函数在程序启动时自动执行,即在 main() 函数执行之前。这个特性通常用于在程序初始化时执行一些必要的设置或资源的初始化。它类似于 C++ 中的全局构造函数或 atexit 函数,但它是直接通过 GCC 特性进行控制的。

1. __attribute__((constructor)) 的基本用法

__attribute__((constructor)) 用于标记一个函数,使得它在程序启动时自动执行,无需显式调用。被标记为 constructor 的函数会在程序的 main 函数之前执行。

语法:

void function_name() __attribute__((constructor));

2. 使用场景

  • 初始化全局变量
  • 配置程序环境
  • 资源初始化,打开文件、数据库连接等
  • 注册全局的信号处理器

3. 示例代码:

示例1:简单的构造函数

#include <iostream>

// 定义一个构造函数,在程序启动时自动调用
void init() __attribute__((constructor));

void init() {
    std::cout << "This is the initialization function. It runs before main." << std::endl;
}

int main() {
    std::cout << "This is the main function." << std::endl;
    return 0;
}

输出:

This is the initialization function. It runs before main.
This is the main function.

解释:

  • init() 被标记为构造函数,所以它在 main() 函数之前执行。
  • 程序的执行流程是:首先调用 init(),然后执行 main() 函数。

示例2:多个构造函数

如果定义了多个带有 constructor 属性的函数,GCC 会按照定义的顺序依次执行它们。

#include <iostream>

// 定义两个构造函数
void init1() __attribute__((constructor(101)));
void init2() __attribute__((constructor(102)));

void init1() {
    std::cout << "This is init1, it runs before main." << std::endl;
}

void init2() {
    std::cout << "This is init2, it runs after init1 but before main." << std::endl;
}

int main() {
    std::cout << "This is the main function." << std::endl;
    return 0;
}

输出:

This is init1, it runs before main.
This is init2, it runs after init1 but before main.
This is the main function.

解释:

  • constructor(101)constructor(102) 是构造函数的优先级指定。数字越小的构造函数优先执行。
  • init1 优先于 init2 执行,但两者都在 main() 函数之前执行。

示例3:带有清理函数的示例(__attribute__((destructor))

C++ 也支持 __attribute__((destructor)) 来指定析构函数,确保在程序结束时执行清理工作。destructor 函数在 main() 函数结束后执行。

#include <iostream>

// 定义析构函数
void cleanup() __attribute__((destructor));

void cleanup() {
    std::cout << "This is the cleanup function. It runs after main." << std::endl;
}

int main() {
    std::cout << "This is the main function." << std::endl;
    return 0;
}

输出:

This is the main function.
This is the cleanup function. It runs after main.

解释:

  • cleanup()main() 函数执行完毕后被自动调用。

4. 构造函数和析构函数的执行顺序

  • 所有带 __attribute__((constructor)) 的函数按优先级数字顺序执行,优先级数字越小,执行越早。
  • 所有带 __attribute__((destructor)) 的函数按逆优先级数字顺序执行,即数字越小,执行越晚。

5. 注意事项

  • __attribute__((constructor)) 是 GCC 的扩展,其他编译器(如 MSVC)可能不支持此特性,或有类似但不同的实现。
  • 这种特性是非常依赖编译器的,尤其在跨平台开发时需要小心使用。
  • constructordestructor 属性只能用于全局函数或静态函数,不能用于类成员函数或内联函数。

总结

  • __attribute__((constructor))__attribute__((destructor)) 是 GCC 提供的功能,用于在程序启动时自动执行初始化函数(构造函数)或在程序退出时自动执行清理函数(析构函数)。
  • 它们为程序初始化和清理提供了一种简单的方法,但需注意其跨平台性限制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LM芯片学习

1、LM7805稳压器 https://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn1852815231102873600&utm_sourcewechat_sessionhttps://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn18528…

ChromeOS 131 版本更新

ChromeOS 131 版本更新 1. ChromeOS Flex 自动注册 在 ChromeOS 131 中&#xff0c;ChromeOS Flex 的自动注册功能现已允许大规模部署 ChromeOS Flex 设备。与 ChromeOS 零接触注册类似&#xff0c;自动注册将通过组织管理员创建的注册令牌嵌入到 ChromeOS Flex 镜像中。这将…

electron打包linux环境

注意:新版的electron已经不支持在win上直接打包Linux的环境了,服务会卡住,会一直生成文件占用磁盘(我发现的时候占了我100G&#xff0c;而且文件夹很深&#xff0c;找了java代码while循环&#xff0c;好不容易删除的o(╥﹏╥)o) electron有一个专门打包的docker镜像&#xff0c…

【SAP FICO】物料分类账详述

系列文章目录 文章目录 系列文章目录前言一、必备基础1、标准价和移动平均价2、概念3、意义4、功能 二、工作原理三、差异的种类与来源1、采用S价可能产生的差异2、单层价格差异和多层价格差异 四、后台配置总结 前言 业务背景&#xff1a;中国会计准则规定&#xff0c;对存货…

电脑文档损坏:原因剖析和修复方法

在使用电脑的过程中&#xff0c;许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑&#xff0c;特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作&#xff1a; 在编…

使用国内镜像网站在线下载安装Qt(解决官网慢的问题)——Qt

国内镜像网站 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/清华大学&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/qt/北京理工大学&#xff1a;http://mirror.bit.edu.cn/qtproject/ 南京大学&#xff1a;https://mirror.nju.edu.cn/qt腾讯镜像&…

活动预告|云原生创新论坛:知乎携手 AutoMQ、OceanBase、快猫星云的实践分享

近年来&#xff0c;云原生技术迅猛发展&#xff0c;成为企业数字化转型的关键动力&#xff0c;云原生不仅极大地提升了系统的灵活性和可扩展性&#xff0c;还为企业带来了前所未有的创新机遇。 12 月 28 日 知乎携手 AutoMQ、OceanBase 和快猫星云推出“云原生创新论坛”主题的…

02-2.python入门语法一变量与数据类型2

四、Python 整数数据类型 &#xff08;一&#xff09;整数的表示方式 1. 十进制表示 十进制是我们在日常生活中最常用的数字表示形式&#xff0c;由 0 到 9 这十个数字排列组合而成。 2. 二进制表示 二进制数由 0 和 1 这两个数字组成&#xff0c;在 Python 中&#xff0c;…

如果在 Swift 数组中寻找最大相邻差值的线性时间算法

文章目录 摘要问题描述解决方案Swift 代码实现代码解析测试用例及结果时间复杂度空间复杂度总结 摘要 本文探讨如何在未排序的数组中&#xff0c;通过线性时间算法找到排序后相邻元素之间的最大差值。我们采用桶排序的思想&#xff0c;给出一个高效的 Swift 实现&#xff0c;并…

EasyExcel 动态设置表格的背景颜色和排列

项目中使用EasyExcel把数据以excel格式导出&#xff0c;其中设置某一行、某一列单元格的背景颜色、排列方式十分常用&#xff0c;记录下来方便以后查阅。 1. 导入maven依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easy…

如何在谷歌浏览器中设置标签页分组

在日常浏览网页时&#xff0c;我们常常会打开多个标签页。随着标签页数量的增加&#xff0c;管理它们变得越来越困难。幸运的是&#xff0c;谷歌浏览器提供了一些实用的功能&#xff0c;可以帮助我们更好地组织和分组标签页。本教程将向您展示如何设置标签页分组&#xff0c;并…

多协议视频监控汇聚/视频安防系统Liveweb搭建智慧园区视频管理平台

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化&#xff0c;将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…

vscode中同时运行两个python文件(不用安装插件)

如何在vscode中同时运行两个python文件呢&#xff1f;今天在工作中遇到了这个问题。 查了网上的方法是安装coder runner插件&#xff0c;后来发现自身就有这个功能。所以记录一下,方便后续查找: 这是我的第一个文件&#xff0c;点击右上角的运行旁边的小箭头&#xff0c;有一…

java全栈day17--Web后端实战(java操作数据库)

前言&#xff1a;本章应该是针对数据库基础讲解&#xff0c;数据的增删改查但是本人忘记对知识进行归纳总结就直接跳过&#xff0c;基本的内容都很简单&#xff0c;都是套式子使用。现在开始学习本章&#xff0c;很重要需要好好掌握。 一、使用的工具 二、JDBC 2.1概述 JDBC …

谷歌发布最新视频生成模型 Veo 2:视频生成AI新王牌

谷歌 在当今数字化快速发展的时代&#xff0c;人工智能视频生成技术正不断突破创新。就在12月17日&#xff0c;谷歌推出了一个新的视频模型 Veo 2 。 Veo 2 Veo 2 Veo 2 可以创建各种主题和风格的高质量视频。在谷歌官方由人工评估员判断中&#xff0c;Veo 2 与领先模型相比取得…

从腾讯云的恶意文件查杀学习下PHP的eval函数

问题来自于腾讯云的主机安全通知&#xff1a; &#x1f680;一键接入&#xff0c;畅享GPT及AI大模型服务&#xff01;【顶级API中转品牌】&#xff1a; https://api.ablai.top/ 病毒文件副本内容如下&#xff1a; <?php function x($x){eval($x);}x(str_rot13(riny($_CBF…

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

Dcoker Redis哨兵模式集群介绍与搭建 故障转移 分布式 Java客户端连接

介绍 Redis 哨兵模式&#xff08;Sentinel&#xff09;是 Redis 集群的高可用解决方案&#xff0c;它主要用于监控 Redis 主从复制架构中的主节点和从节点的状态&#xff0c;并提供故障转移和通知功能。通过 Redis 哨兵模式&#xff0c;可以保证 Redis 服务的高可用性和自动故…

golang操作sqlite3加速本地结构化数据查询

目录 摘要Sqlite3SQLite 命令SQLite 语法SQLite 数据类型列亲和类型——优先选择机制 SQLite 创建数据库SQLite 附加数据库SQLite 分离数据库 SQLite 创建表SQLite 删除表 SQLite Insert 语句SQLite Select 语句SQLite 运算符SQLite 算术运算符SQLite 比较运算符SQLite 逻辑运算…