单元测试与main前运行函数__attribute__((constructor))关键字
2012-08-16 15:46
351 查看
为了便于单元测试,做了一个utl_cmd的小模块,它会负责插入命令,解析命令并执行。
利用这些命令,可以方便的在程序运行过程中对模块进行测试。
而这里有个比较麻烦的问题是,必须要调用utl_cmd_insert先把测试命令插入到命令序列中。
否则utl_cmd模块,也不知道都有哪些命令可以支持。
为解决此问题,忽然想起来之前看DirectFB代码时,遇到过main函数运行前自动运行的函数。
经多方查找,终于实现了。
利用这个特性,就不需要再在main函数中先调用插入命令的函数了。
还有个需要注意之处:
如果,测试代码在一个单独的模块,单独的文件中,而这个文件中的任何函数都没被外部调用的话,
可能会导致自动运行不成功。
原因是,链接过程中,将这个文件整个的删除掉了。
为了避免此问题的发生,可以在链接时,加入-Wl,--whole-archive -l(你的库) -Wl,--no-whole-archive 来避免此问题
利用这些命令,可以方便的在程序运行过程中对模块进行测试。
而这里有个比较麻烦的问题是,必须要调用utl_cmd_insert先把测试命令插入到命令序列中。
否则utl_cmd模块,也不知道都有哪些命令可以支持。
为解决此问题,忽然想起来之前看DirectFB代码时,遇到过main函数运行前自动运行的函数。
经多方查找,终于实现了。
#include <stdio.h> #include <stdlib.h> static void foo(void) __attribute__ ((constructor)); static void bar(void) __attribute__ ((destructor)); int main(int argc, char *argv[]) { printf("foo == %p\n", foo); printf("bar == %p\n", bar); exit(EXIT_SUCCESS); } void foo(void) { printf("hi dear njlily!\n"); } void bar(void) { printf("missing u! goodbye!\n"); } lfx@ubuntu:temp$ gcc main.c lfx@ubuntu:temp$ ./a.out hi dear njlily! foo == 0x8048473 bar == 0x8048487 missing u! goodbye!
利用这个特性,就不需要再在main函数中先调用插入命令的函数了。
int mplayer_test_init() __attribute__((constructor)) ; int mplayer_test_init() { char *helper = "\tmplayer prepare [WINDOW COUNT]\n" "\tmplayer play [chn] [fname]\n" "\tmplayer stop [chn]\n" "\tmplayer over\n" "\tmplayer step [chn]\n" "\tmplayer back [chn]\n" "\tmplayer fast [chn] [speed 2,4,8,16,32]\n" "\tmplayer slow [chn] [speed 2,4,8,16,32]\n" "\tmplayer pause [chn]\n" "\tmplayer resume [chn]\n" "\tmplayer allplay\n" "\tmplayer allspeed [fast | slow] [speed]\n" "\tmplayer allstop\n" ; utl_cmd_insert("mplayer", "mplayer test", helper, mplayer_main); return 0; }
还有个需要注意之处:
如果,测试代码在一个单独的模块,单独的文件中,而这个文件中的任何函数都没被外部调用的话,
可能会导致自动运行不成功。
原因是,链接过程中,将这个文件整个的删除掉了。
为了避免此问题的发生,可以在链接时,加入-Wl,--whole-archive -l(你的库) -Wl,--no-whole-archive 来避免此问题
相关文章推荐
- jar 打包java class文件后,运行jar 出现 Failed to load Main-Class manifest attribute from 错误
- 运行jar 提示 Failed to load Main-Class manifest attribute from
- main()是程序运行的第一个函数吗?
- C++第三周任务3请在原类基础上,增加成员函数,要求前三个设计成内置函数,在main()数中增加适当的调用以展示扩充类定义后的功能(最好能一次运行)。
- c++中关键字static在普通变量及函数详解及实例运行答案
- 实验九指针1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 运行jar 提示 Failed to load Main-Class manifest attribute from
- c++中关键字static在普通变量及函数详解及实例运行答案
- 实验9 指针1 、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依
- 设置在main 之前运行的函数
- 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行
- jar文件运行时:Failed to load Main-Class manifest attribute from ......解决办法
- Linux系统下运行jar文件,提示:No main manifest attribute, in XXX.jar
- c++中关键字static在普通变量及函数详解及实例运行答案
- 函数属性__attribute__((constructor))和__attribute__((destructor))
- c++中关键字static在普通变量及函数详解及实例运行答案
- Linux系统下运行jar文件,提示:No main manifest attribute, in XXX.jar
- 用 __attribute__ 将函数注册到.ctors段 使接口在main之前执行
- C语言 设置在main 之前运行的函数
- 没有return关键字的main()函数返回值