一、前言
我们知道C++的全局对象的构造函数会在main函数之前先运行,其实在c语言里面很早就有啦,在 gcc中可以使用 __attribute__ 关键字指定(在编译器编译的时候就决定了)。
二、C语言
关键字attribute可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
gnu对于函数属性主要设置的关键字如下:
- alias: 设置函数别名。
- aligned: 设置函数对齐方式。
- always_inline/gnu_inline: 函数是否是内联函数。
- constructor/destructor:主函数执行之前、之后执行的函数。
- format: 指定变参函数的格式输入字符串所在函数位置以及对应格式输出的位置。
- noreturn:指定这个函数没有返回值。请注意,这里的没有返回值,并不是返回值是void。而是像_exit/exit/abord那样执行完函数之后进程就结束的函数。
- weak:指定函数属性为弱属性,而不是全局属性,一旦全局函数名称和指定的函数名称命名有冲突,使用全局函数名称。
#include <stdio.h>
void before() __attribute__((constructor));
void after() __attribute__((destructor));
void before() {
printf("this is function %s\n",__func__);
return;
}
void after(){
printf("this is function %s\n",__func__);
return;
}
int main(){
printf("this is function %s\n",__func__);
return 0;
}
// 输出结果
// this is function before
// this is function main
// this is function after
三、C++
全局对象的构造函数会先于main函数执行!
#include <iostream>
#include <string>
using namespace std;
class A {
public:
A(string s) {
str.assign(s);
cout << str << ":A构造" <<endl;
}
~A(){
cout << str << ":A析构" <<endl;
}
private:
string str;
};
A test1("Global"); // 全局对象的构造
int main() {
A test2("main"); // 局部对象的构造
return 0;
}
// 输出结果
// Global:A构造
// main:A构造
// main:A析构
// Global:A析构