当前位置: 首页 > news >正文

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

http://www.mrgr.cn/news/80605.html

相关文章:

  • 【Microi吾码】:低代码加速业务和技术深度融合
  • 基于单片机的农田灌溉系统(论文+源码)
  • 单片机:实现多任务处理(附带源码)
  • Oralce 字段值与单引号拼接成字符串
  • 2-2-18-15 QNX系统架构之高可用性
  • C# 用封装dll 调用c++ dll 使用winapi
  • LearnOpenGL学习(高级OpenGL - - 实例化,抗锯齿)
  • 计算机网络-网络层
  • c++:STL:string
  • Pytorch | 从零构建GoogleNet对CIFAR10进行分类
  • Eureka学习笔记-服务端
  • Frida进行Android dex文件整体脱壳
  • 【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string,垃圾回收( GC)
  • Java函数式编程【三】【Stream终止操作】【上】之【简单约简】
  • ElasticSearch 数据聚合与运算
  • 基础开发工具-编辑器vim
  • 005 QT常用控件Qwidget_上
  • linux0.11源码分析第一弹——bootset.s内容
  • kali Linux 2024.3安装教程2024(图文超详细)
  • LED 灯实验
  • C# WinForm移除非法字符的输入框
  • 四、CSS3
  • Java集合 HashMap 原理解读(含源码解析)
  • 灵当crm pdf.php存在任意文件读取漏洞
  • C#速成(GID+图形编程)
  • C++之二:类和对象