C++是面向对象的一个编程,当对象作用域结束内存被回收时会调用析构,当创造内存空间时会调用构造,便于我们初始化与释放。

当然C语言这个面向过程的编程语言也有初始化与释放

在编译器里只需要使用__attribute__来修饰我们的函数属性就可以了,将函数属性设置为constructor,代表初始化,修饰为destructor则为释放。

这里需要注意,每个编程语言的思想不同,c语言是面向过程的,也就是说只有你的函数声明为constructor,只会被你的程序调用一次,不能像C++那样灵活在程序运行期间创建多个对象,调用多次构造函数,因为C语言思想就是面向过程,这中间主要还是起源于历史痕迹,在早期的历史里,单片机内存太小了,4KB都相当于现在的400G,那个时候不存在抢占式这样的内核工作状态,同时面向对象需要更多的语法以及解释代码来完成,所以那个时候历史规定了C语言的思想。

言归正传,来看看具体怎么使用吧

constructor 当函数被修饰为这个属性时,编译器会在调用main函数之前调用它

destructor 当函数被修饰为这个属性时,编译器会在main函数结束或者调用exit强制结束程序时调用它

示列代码:

int main(int argc, char * argv[]) {printf("111");return 0;
}
__attribute__((constructor)) void test()
{printf("test\n");
}__attribute__((destructor )) void test_end()
{printf("test_end\n");
}

打印结果:

test

111

test_end

同时支持多个构造与释放,但是需要加上优先级

int main(int argc, char * argv[]) {printf("111");return 0;
}
__attribute__((constructor(1))) void test()
{printf("test1\n");
}__attribute__((constructor(2))) void test1()
{printf("test2\n");
}__attribute__((destructor(1))) void test_end()
{printf("test_end1\n");
}__attribute__((destructor(2))) void test_end1()
{printf("test_end2\n");
}

结果:

test1

test2

111

test_end1

test_end2

当然也允许你声明与实现分开

__attribute__((constructor(101))) void test();void test()
{printf("test\n");
}

C/C++开发_C语言里类似C++的构造与析构相关推荐

  1. c语言负数左移右移_C语言里的左移和右移运算

    C语言里的左移和右移运算 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用运算符.例如:int i = 1;i = i 2; /把i里的值左移2位也就是说,1的2进制是000.0001(这 ...

  2. C++_类和对象_C++继承_继承中的构造和析构顺序---C++语言工作笔记064

    然后我们再去看c++中的构造和析构函数的执行的顺序. . 直接用案例说明,可以看到,上面呢,我们写个Base类,然后 写这个类的构造方法. 然后我们在Base类中写上构造方法,和析构方法. 然后我们再 ...

  3. python表示整除的符号_c语言中整除符号怎么表示?_后端开发

    c语言fun函数有什么例题?_后端开发 c语言fun函数例题有:1.fun函数表示计算x的y次幂,代码为[for(int i=1;i<=y;i++)result*=x]:2.fun函数交换两个指 ...

  4. c语言精品课程网站论文免费下载,【毕业论文_c语言程序设计精品课程网站的研究与实现6喜欢就下吧材料】...

    毕业论文_c语言程序设计精品课程网站的研究与实现(6)(喜欢就下吧) <毕业论文_<c语言程序设计>精品课程网站的研究与实现.doc>由会员分享,可免费在线阅读全文,更多与&l ...

  5. Android Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

  6. 三千年前的古文字被 AI 破译,MIT 和谷歌开发失传语言的机器翻译系统

    本文授权转载自大数据文摘 | BigDataDigest文章有部分改动 文字是文明的重要标志和载体,古老的文明都拥有自己的文字.沿着文字的变迁,我们能够追溯历史的进展. 然而,文字会随着文明的毁灭而失 ...

  7. 贪吃蛇_C语言_链表实现_SCAU课程设计

    个人大一下课程设计作品,本文中直接附上源代码(通过visual stdio 2019 实现  ): 课题:贪吃蛇(链表实现~) 语言:C/C++ 运行环境(软件):Visual Stdio 2019( ...

  8. gba c语言编程,GBA开发C语言内功补习

    自从学习开发GBA后,便对其开发的容易性,效率为之吸引. 想必大家也是如此. 因为GBA开发多数是使用C语言的, 这里写一点基本的C语言的使用技巧. 希望能增加大家的内功. 1 对内存里的寄存器进行操 ...

  9. c语言程序设计编辑与调试环境实验报告,01程序设计基础实验报告_C语言程序设计基础.doc...

    01程序设计基础实验报告_C语言程序设计基础 程序设计基础 实验报告 题 目: C语言程序设计基础 院 (部): 管理工程学院 专 业: 信息管理与信息系统 班 级: 信管101 姓 名: 张三 学 ...

最新文章

  1. IC/FPGA校招笔试题分析(一)
  2. 轻松实现Access数据导入Oracle!
  3. 分区表的本地索引竟然失效了——ORA-01502
  4. 24岁博士毕业,受聘211高校副教授,90后开挂背后是自律和坚持
  5. 高性能 TCP UDP 通信框架 HP-Socket v3.2.3
  6. JAVA面试常考系列九
  7. 酱油和gbt酱油哪个好_酱油越贵越好?认准瓶身这4处,轻松挑到好酱油!
  8. 作者:赵雷,山东农业大学硕士生。
  9. NoSQL介绍(七)
  10. 不用点击_网站推广怎么样才能提高点击量和转化率-西安青云在线
  11. Vue 中watch和computed 的用法及区别
  12. Ansible详解(五)——Ansible其他模块使用详解
  13. linux日常学习笔记
  14. Intellij mac快捷键
  15. linux环境下安装curl,Linux环境下curl安装和移植
  16. 后台 事务SqlTransaction
  17. 安卓手机优化,修改build.prop
  18. pandas filter数据筛选
  19. 1的1次方+2的2次方+3的3次方+...+n的n次方
  20. 分析oj 网的题目难度和通过率的关系

热门文章

  1. vue上传图片文件到服务器,vue如何将quill图片上传到服务器
  2. 下载 LINUX 和 windows 版本下 MySQL5.7.32
  3. java this()函数_Java经典面试题之(如何正确的使用this?)
  4. linux 开机加载的文档,Linux 修改文档“打开方式”
  5. 计算机二级公共知识总结,计算机二级公共基础知识考点总结
  6. python的设计哲学_Python的设计哲学
  7. mysql密码登陆过程_mysql单实例忘记密码如何登陆过程
  8. python大文件去重_python大ip文件排重
  9. 安卓app开发工具_手机APP开发会涉及到哪些知识点呢?
  10. python信号处理的优点_python 信号处理