作者:令狐掌门
技术交流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)可能不支持此特性,或有类似但不同的实现。- 这种特性是非常依赖编译器的,尤其在跨平台开发时需要小心使用。
constructor
和destructor
属性只能用于全局函数或静态函数,不能用于类成员函数或内联函数。
总结
__attribute__((constructor))
和__attribute__((destructor))
是 GCC 提供的功能,用于在程序启动时自动执行初始化函数(构造函数)或在程序退出时自动执行清理函数(析构函数)。- 它们为程序初始化和清理提供了一种简单的方法,但需注意其跨平台性限制。