attribute constructor&destructor

attribute constructor&destructor

在看openwrt里libnl-tiny这个库的时候,遇到了C里面的构造函数这个概念。

static void __init init_msg_size(void)
{
    default_msg_size = getpagesize();
}

这个static函数没有显示被其它地方调用,但确用了__init修饰。__init定义在include/netlink-local.h中:

#define __init __attribute__ ((constructor))
#define __exit __attribute__ ((destructor))

写一个测试函数

#include <stdio.h>

#define __init __attribute__ ((constructor))
#define __exit __attribute__ ((destructor))

static __init void before(void)
{
    printf("before\n");
}

static __exit void after(void)
{
    printf("after\n");
}

int main(void)
{
    printf("main\n");
    return 0;
}

打印结果为:

$ ./hello 
before
main
after

还可以定义优先级:

#include <stdio.h>

#define __init101 __attribute__ ((constructor(101)))
#define __init102 __attribute__ ((constructor(102)))
#define __exit101 __attribute__ ((destructor(101)))
#define __exit102 __attribute__ ((destructor(102)))

static __init101 void before101(void)
{
    printf("%s\n", __func__);
}

static __init102 void before102(void)
{
    printf("%s\n", __func__);
}

static __exit101 void after101(void)
{
    printf("%s\n", __func__);
}

static __exit102 void after102(void)
{
    printf("%s\n", __func__);
}

int main(void)
{
    printf("%s\n", __func__);
    return 0;
}

打印结果为:

$ ./hello 
before101
before102
main
after102
after101

优先级0~100被保留,自定义的优先级从101开始。

转载于:https://www.cnblogs.com/sammei/p/3994658.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值