【001 函数】请写个函数在main函数执行前先运行

一、前言

我们知道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析构

四、参考内容

如何在 main() 执行之前先运行其它函数 - 爱笑的张飞 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值