C语言扩展属性——constructor分析
-
背景
在使用gtest测试框架时,发现如果引用gtest_main这个库,就用自家去写一个main函数了,而且原来就会被屏蔽,当时就对这个功能很好奇,可惜没去研究一下源码,探究一下原因,在阅读其他项目源码时,发现这个constructor和destructor这个两个属性,然后就明白了gtest_main的实现机制。
1. constructor和destructor属性的用处
-
被constructor属性修饰的函数,在main函数执行前自动执行,被destructor属性修饰的函数,将在main函数后自动执行,他们的执行顺序是
- constructor函数
- main()
- destructor函数
- exit()
-
在定义constructor和destructor函数时,可以指定其优先级,数字越小优先级越高,但是0-100的优先级属于保留级别。
-
demo程序
#include <stdio.h> __attribute__((constructor(101))) void setup(void) { printf("this is constructor\n"); } __attribute__((destructor(101))) void finish(void) { printf("this is destructor\n"); } int main() { printf("this is main\n"); return 0; }其执行结果为
this is constructor this is main this is destructor
2. 总结
- 在一次测试框架搭建过程中,由于嵌入式的测试框架较为简单,我对于测试用例的入口函数认为应该需要修改main函数来实现,但是发现constructor特性后发现这个扩展属性在这一种情况下更为友好,在不用变动源码的情况下,实现单元测试的执行。
文章介绍了C语言中constructor和destructor属性在gtest框架中的使用,它们分别在main函数前后自动执行,且可通过设置优先级进行控制。这些特性在测试框架中提供了无需修改源码的测试用例执行方式。

1233

被折叠的 条评论
为什么被折叠?



