C语言函数调用错误信息打印

本文详细介绍了C语言中使用perror()和strerror()进行错误处理的方法,通过具体示例展示了如何结合__FILE__和__LINE__宏在程序中精确定位错误发生的位置和原因,适用于提高程序调试效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

我的目的是在程序调用函数的时候,返回错误原因+那个文件内被调用+所在文件行号,如:端口已被使用[to_listen.c:21]
在调试程序的时候,函数返回结果为错误,但是一直不知道是什么原因报的错,我就想到了标准错误。以前没用过,所以自己尝试了一下,找到errno。每次用gdb调试,都是用“p errno”得到错误号,在去百度“linux错误处理与错误号_百度文库”找出对应的宏。接着man出错的那个函数,看他“errors”对应宏素表示的错误。我发现这样很麻烦,因为我需要的就是“表示的错误”的意思。所以我关注了一下“perror()”和“strerror()”函数。一个是直接输出给2号句柄,及标准错误,会在屏幕上立即显示(标准错误未重定向)。一个是返回错误信息的字符串指针,可以选择不输出,也可以更灵活的打印出来。

所需头文件

#include<errno.h>
#include<string.h>

PERROR()

对于我来说,缺点就是最多只能传一个参数(char*类型),当然也可以不传参。因为参数的限制,一行我只能打印文件名+错误原因。
例子

 21 int tobind=bind(mysocket,(struct sockaddr*)&mysockaddr_in,sizeof(mysockaddr_in));
 22 if(tobind!=0)
 {
 23 perror(__FILE__);
 24 return 0;
 25 }

结果:to_listen.cThe given address is already in use.

STRERROR()

更自由的打印错误,可以不显示不想要的信息,添加自己想要的信息。
例子

 21 int tobind=bind(mysocket,(struct sockaddr*)&mysockaddr_in,sizeof(mysockaddr_in));
 22 if(tobind!=0)
 23 {
 24     printf("ERRO:%s[%s:%d]\n",strerror(errno),__FILE__,__LINE__-3);
 25 return 0;
 26 }

结果:ERRO:The given address is already in use.[to_listen.c:22]

两个宏说明:

各位最好用MSDN等去看一下相关的所有的宏,因为我这里值用到了两个,所以我也只说着两个。

FILE(左右各两个下划线未显示)

当前函数所在文件名字符串

LINE(左右各两个下划线未显示)

此宏所在行数。网上看,因为bind函数在21行,而我宏在24行被使用,所以在printf里我执行了“-3”操作。

其他函数:

error();error_at_line(推荐使用);
如果果味大佬觉得还阔以的话,就点个收藏再点个赞才走吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值