最经典的应用可以去看linux源码里的函数device_create(...)和class_device_create(...), 做linux驱动开发的小伙伴应该对这两个函数不陌生.
__attribute__ noreturn 该属性通知编译器函数从不返回值。当遇到函数需要返回值却还没运行到返回值处就已退出来的情况,该属性可以避免出现错误信息。
C库函数中的abort()和exit()的声明格式就采用了这种格式:
extern void exit(int) __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));
例如下面这段代码:
- extern void myexit(int);
- int testFunc(void)
- {
- printf("-- Enter %s --", __func__);
- myexit(0);
- // 其实函数运行不到这里
- printf("-- Exit %s --", __func__);
- }
- void myexit(int i)
- {
- exit(i);
- }
编译时会报"control reaches end of non-void function"的警告, 但若将"extern void myexit(int);"改为"extern void myexit(int) __attribute__((noreturn));" 就不会再报警告了.
__attribute__ constructor/destructor 若函数被设定为constructor属性,则该函数会在 main()函数执行之前被自动的执行。类似的,若函数被设定为destructor属性,则该函数会在main()函数执行之后或者exit()被调用后被自动的执行。拥有此类属性的函数经常隐式的用在程序的初始化数据方面。
这两个属性还没有在面向对象C中实现。
- __attribute__((constructor)) void before_main() {
- printf("--- %s\n", __func__);
- }
- __attribute__((destructor)) void after_main() {
- printf("--- %s\n", __func__);
- }
-
- int main(int argc, char **argv) {
- printf("--- %s\n", __func__);
-
- exit(0);
-
- printf("--- %s, exit ?\n", __func__);
- return 0;
- }
执行结果为:
- --- before_main
- --- main
- --- after_main
|