首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GCC C:有没有等同于调用__attribute__(清理)函数的exit()?

GCC C中没有等同于调用attribute(清理)函数的exit()的函数。exit()函数用于正常终止程序,并在终止前执行一些清理操作,例如关闭文件、释放内存等。而attribute(清理)函数是GCC的扩展特性,用于在函数返回或程序终止时执行一些清理操作。这两者虽然都可以用于清理操作,但是它们的使用方式和作用范围有所不同。

exit()函数是C标准库中的函数,可以在程序的任何地方调用,用于终止程序的执行。它会执行一系列的清理操作,包括调用注册的终止处理函数(通过atexit()函数注册)、关闭打开的文件、刷新缓冲区等。exit()函数的原型为:

代码语言:txt
复制
void exit(int status);

attribute(清理)函数是GCC的扩展特性,可以在函数定义时使用,用于指定在函数返回或程序终止时执行的清理操作。它的语法如下:

代码语言:txt
复制
void function_name() __attribute__((cleanup(cleanup_function)));

其中,cleanup_function是一个清理函数,会在函数返回或程序终止时被调用。attribute(cleanup)可以用于自动释放资源,例如关闭文件、释放内存等。但是它只能用于函数的返回或程序的终止,无法像exit()函数一样在任何地方调用。

需要注意的是,attribute(清理)函数是GCC的扩展特性,不是C标准库中的函数,因此在其他编译器中可能不被支持。如果需要在不同编译器中保持代码的可移植性,建议使用标准的exit()函数来进行程序的终止和清理操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言main函数解析

当然参数传递还可以有其他方式,在下一节中,会单独来讲。 main 函数返回值类型必须是 int ,这样返回值才能传递给程序调用者(如操作系统),等同于 exit(0),来判断函数执行结果。...C++89中定义了如下两种 main 函数定义方式: int main( )  int main( int argc, char *argv[] )  int main( ) 等同于 C99 中 int...结果当然不是,在main函数运行之后还有其他函数可以执行,main函数执行完毕之后,返回到入口函数,入口函数进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程。...在 exit 所执行任何标准清理操作之前,被注册函数按照与注册顺序相反顺序被依次调用。每个被调用函数不接受任何参数,并且返回类型是 void。...通过atexit可以注册回调清理函数。可以在这些函数中加入一些清理工作,比如内存释放、关闭打开文件、关闭socket描述符、释放锁等等。

2.5K88

干货 | 深度剖析C语言main函数

当然参数传递还可以有其他方式,在下一节中,会单独来讲。 main 函数返回值类型必须是 int ,这样返回值才能传递给程序调用者(如操作系统),等同于 exit(0),来判断函数执行结果。...C++89中定义了如下两种 main 函数定义方式: int main( ) int main( int argc, char *argv[] ) int main( ) 等同于 C99 中...结果当然不是,在main函数运行之后还有其他函数可以执行,main函数执行完毕之后,返回到入口函数,入口函数进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程。...在 exit 所执行任何标准清理操作之前,被注册函数按照与注册顺序相反顺序被依次调用。每个被调用函数不接受任何参数,并且返回类型是 void。...通过atexit可以注册回调清理函数。可以在这些函数中加入一些清理工作,比如内存释放、关闭打开文件、关闭socket描述符、释放锁等等。

1.7K40

main函数真的是C程序开始吗?

我们在学习和编写C程序时,都是从main函数开始,main函数作为入口函数已经深深地印在我们脑海中,那么main函数真的是C程序入口函数吗?带着这个问题我们先来看下面一段代码。 1....从运行结果中,我们可以看出来beforeMain是在进入main函数之前被调用,这对于C语言初学者来说似乎有点难以理解。究竟是谁调用beforeMain呢?...构造函数属性使函数在执行进入main()之前自动被调用 GNU C一大特色就是__attribute__机制。...同理, destructor让系统在main()函数退出或者调用exit()之后,调用我们函数。...在main函数之前,执行一个函数,便于我们做一些准备工作;在main()函数退出或者调用exit()之后调用

45110

__attribute__机制介绍

: too few arguments for format 如果在attribute.c函数声明去掉__attribute__((format(printf,1,2))),再重新编译, 既运行$gcc...C函数abort()和exit()声明格式就采用了这种格式: extern void  exit(int)   __attribute__( ( noreturn ) ); extern void...恰好在函数入口之后并恰好在函数出口之前,将使用当前函数地址和调用地址来调用下面的profiling函数。...类似的,若函数被设定为destructor属性,则该函数会在main()函数执行之后或者exit()被调用后被自动执行。...__attribute__( (noreturn,  format(printf, 1, 2)) ); 如果带有该属性自定义函数追加到库头文件里,那么所以调用函数程序都要做相应检查。

2.8K11

属性“__attribute__”在Objective-C应用

属性“__attribute__”在Objective-C应用       关于__attribute__,你可能用不多,但是一定经常见到,在系统Foundation框架中,__attribute...5. cleanup       cleanup属性可以实现一个非常强大功能,它有这样一种特点,可以为某个变量指定一个清理函数,当变量离开其作用域时候,会调用这个清理函数,示例如下: void clean...return 0; } 需要注意,指定清理函数会将当前变量指针作为参数传入。...8. objc_requires_super       这个属性用来修饰Objective-C中父类方法,如果子类进行了重写,在重写方法中没有调用父类方法,则会进行编译器提示。...overliadable属性可以指定某个函数为可重载,这样既可定义名字相关参数不同多个C函数,在调用时,编译器会根据传入参数类型自行判断具体调用哪个函数,如下: ?

2.2K20

iOS 编译器__Attribute__入门指南

用来添加一些函数调用时需要满足条件,会在编译时发出警告或者提醒 //不会发出运行时警告。...// constructor/destructor,构造器和析构器,可以在main函数之前和之后调用函数 // constructor 调用会比load方法晚一点 // destructor 会调用在...exit函数之前。...exit() 函数是 _Noreturn 函数一个示例,一旦调用exit() 它不会往下执行了。 和 void 返回类型不同是,void 类型函数再执行完毕后返回主调函数,只是它不提供返回值。...,deprecated=10.6,obsoleted=10.7))); // 这个参数列表有没有感觉像 @#available() 2、C 中重载一个C++函数 // 在C中重载一个C++函数C函数重载是使用可重载属性引入

90020

宋宝华: 关于Linux编译优化几个必须掌握姿势

其实O2和Os,都是一些优化选项集合: gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts gcc -c -Q -Os --help=optimizers >...O0编译会报如下错,说f()函数没有定义: $ gcc -O0 cc.c cc.c:1:13: warning: ‘f’ used but never defined [enabled by default...to `f' collect2: error: ld returned 1 exit status 但是用O2编译,则没有问题: $ gcc -O2 cc.c 原因在于,O2编译,它意识到a==1,所以...3.我们不想inline了 由于编译优化,有些函数(比如小函数和全工程里面只被一个人调用函数)虽然没有显示地写成inline,但是编译器优化为inline了,这给调试造成了一些麻烦,因为找不到这个函数对应...4.我不想被优化 在全局已经使能O1, O2, O3, Os情况下,某个单独函数我们不想做任何优化,可以用__attribute__((optimize("O0")))来修饰这个函数,比如我们把上述用

2.9K20

【教程】如何用GCC“零汇编”白嫖MDK

正如错误提示中指出那样,CMSIS会在一个叫做 __cmsis_start函数中,调用 "_start" 函数,而这一函数正是gcc标准启动文件入口,当你在MDK中选择"Do not use Standard..." int main(void) { while(1) { } return 0; } __attribute__((noreturn)) void exit(int err_code...) { while(1) { __NOP(); } } GCC要求main函数返回值是 int 类型,而这里返回值会被作为 exit() 函数传入参数——一般负数表示出错...如果不实现一个 exit() 函数,链接器会报错。 __attribute__((noreturn)) 就是字面意思,告诉编译器这个这个函数是有去无回。...更糟糕是,这种判定是具有“传染”性,这意味着哪怕某一个section中存在没用到函数,只要该section被判定为要保留,则这些没有用到函数调用函数,其所在section也会被传染。

1.7K10

C语言函数调用约定

d); // fastcall ,函数第一个和第二个DWORD参数通过ecx和edx传递(a->ecx,b->edx), //其他参数通过从右向左顺序压栈,被调用函数清理堆栈...,调用函数清理堆栈 128c: ff 75 fc push DWORD PTR [ebp-0x4] //d 128f...函数调用惯例在函数声明和函数定义时都可以指定,语法格式为: ‌返回值类型 调用惯例 函数名(函数参数) int __cdecl max(int m, int n); // __cdecl是C语言默认调用约定...__cdecl 并不是标准关键字,是在 VC/VS 下有效,但在 GCC 下,要使用 __attribute__((cdecl))。...函数第一个和第二个DWORD参数通过ecx和edx传递,剩下参数按照从右到左顺序入栈 cdecl: C语言默认,变参函数 由于每次函数调用都要由编译器产生还原栈代码,所以使用 __cdecl

12510

C11 标准特性研究

相比C99,C11有哪些变化呢!!所有的测试全部基于能够和标准贴合特性平台. 但是绝大部   分来源于 GCC. 这里不妨教大家源码安装最新GCC吧。   a....(EXIT_FAILURE);     free(ptr); }   2、 _Noreturn     _Noreturn是个函数修饰符,位置在函数返回类型前面,声明函数无返回值,   有点类似于gcc...__attribute__((noreturn)),后者在声明语句尾部。   ...0; }   其实本质等同于, 真的有点鸡肋    #if __STDC_VERSION__ >= 201112L #   error "It is c11 version" #endif   5、安全版本几个函数..., 刷新文件描述符. quick_exit 处理流程非常简单, 先执行 at_quick_exit   注册函数随后交给 _exit 直接退出, 但是如果 at_quick_exit调用exit

1K00

Linux系统调用原理

一、什么是系统调用 系统调用 跟用户自定义函数一样也是一个函数,不同是 系统调用 运行在内核态,而用户自定义函数运行在用户态。...系统调用 是 Linux 内核提供一段代码(函数),其实现了一些特定功能,用户可以通过 int 0x80 中断(x86 CPU)或者 syscall 指令(x64 CPU)来调用 系统调用。...翻译成 C 代码如下: long sys_call_table[] = { sys_ni_syscall, sys_exit, sys_fork, sys_read, sys_write...GCC 编译选项,如下: #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) __attribute__((regparm(0...))) 就是告诉 GCC 所有参数都从栈中读取,而 Linux 进入中断处理上下文时,会把 ebx、ecx、edx、esi、edi、ebp 寄存器值保存到内核栈中,那么 系统调用 就可以从内核栈获取到参数

4.1K30

关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性讨论小记

而在PE中,dll调用函数,除非标记为 __declspec(dllimport),总是从本模块符号表总查找。...__((visibility("default"))) 之后,对某个名字函数调用总会找到同一个函数地址(除非 dlopen+dlsym 然后显式按地址调用)。...同时在Windows下 GCC/Clang 中,也有对应选项 __attribute__((selectany)) (注意 selectany 只能用于变量,不能用于函数)。...COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/.....而函数内static变量是在第一次访问时初始化。 虽然C++ 11规定函数内static变量初始化必须是线程安全,但是GCC和Clang都是通过一个atomic操作去判定是否初始化

95430

Linux GNU C 和 ANSI C 区别

asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET; format属性也用于函数,表示该函数使用printf、scanf或...long c; } __attribute__((aligned(4))); 表示该结构类型变量以4字节对齐。...9.内建函数 GNU C提供了大量内建函数,其中大部分是标准C函数GNU C编译器内建版本,例如memcpy()等,它们与对应标准C函数功能相同。...内建函数__builtin_return_address(LEVEL)返回当前函数或其调用返回地址,参数LEVEL指定调用级数,如0表示当前函数返回地址,1表示当前函数调用返回地址。...: gcc -c test.c 如果使用“-ansi–pedantic”编译选项,编译会报警: gcc -ansi -pedantic -c test.c test.c:3: warning: ISO

5.3K40

C语言进阶小技巧,弱符号和弱引用

用于在 C,C++,Objective-C 中修饰变量、函数、参数、方法、类等。 合理使用 __attribute__ 有什么好处?...这个其实是是有所偏颇,GNU C对标准C语言进行了扩展,在GCC中,对于符号(在编译时,变量和函数都被抽象成符号)而言,存在着强符号和弱符号之分。...注意这里是声明而不是定义,既然是引用,那么就是使用其他模块中定义实体,对于函数而言,我们可以使用这样写法: __attribute__((weakref)) void func(void); 然后在函数调用...func(),如果func()没有被定义,则func值为0,如果func被定义,则调用相应func,在《程序员自我修养》这本书中有介绍,它是这样写: __attribute__((weakref)...注意:C标准里根本没有提到强、弱符号。这只是GCC这个实现定义特性,在MS C编译器里是不存在这个概念。 本文系网络素材,版权归原作者所有,如有侵权,请联系删除。

80520

吴章金: 实例解析 Linux C 语言程序之变量类型

先来编译成一个中间可重定位文件: $ gcc -m32 -c -o print.o print.c 针对加 static 情况: $ readelf -s print.o | egrep "hello...stack 函数内 register int z = 33; register(汇编中分配好) 函数参数 argc, argv stack(默认调用约定) 再补充几点: 1.用 register 定义变量存放在寄存器中...可以通过查看汇编代码确认: $ gcc -m32 -S -o hello.s hello.c $ grep 33 hello.s movl $33, %ebx 2.函数内用 static 定义变量名...(i 和 j)在符号表中都加了后缀,主要是方便多个函数定义同样变量名,因为这些变量仅限该函数内(含多次调用)可见。...4.关于函数参数传递,如果明确改变了调用约定,比如函数明确加了 \_\_attribute\_\_((fastcall)) 声明,那么部分参数将通过寄存器传递。

1K30

静态链接库和动态链接库区别

动态库而言:某个程序在运行中要调用某个动态链接库函数时候,操作系统首先会查看所有正在运行程序,看在内存里是否已有此库函数拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。...在程序运行时候,被调用动态链接库函数被安置在内存某个地方,所有调用程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。...在程序main.c中,我们包含了静态库头文件add.h和sub.h,然后在主程序main中直接调用公用函数add()和sub()即可。2.5、生成目标程序main,然后运行....1、动态库构造和析构函数机制在Linux中,提供了一个机制:在加载和卸载动态库时,可以编写一些函数,处理一些相应事物,我们称这些函数为动态库构造和析构函数,其代码格式如下:void __attribute...举个例子,动态库文件a.c代码如下:void __attribute__((constructor)) my_init(void){ printf("init library\n"); }编译成动态库

7.9K21

弱符号__attribute__((weak))

attribute((weak))作用 情况是这样,碰到一个棘手问题:我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数,即自己模块代码必须用到func函数: extern int...2:外部其实不存在这个函数,那么我们使用func,程序直接崩溃。 所以这个时候,__attribute__((weak)) 派上了用场。...如果外部模块没有定义,那么,将会调用这个弱符号,也就是在本地定义func,直接返回了一个1(返回值视具体情况而定) 相当于增加了一个默认函数。...main.c #include extern void real_func(); void main() { real_func(); } 如果 gcc main.c...如果将strong.c 和 weak.c编译成.a或者.o gcc main.c strong.o weak.o 或者 gcc main.c strong.o weak.o 那么输出结果都是"real

6.1K30
领券