C语言自定义错误打印函数

最后编辑:2024/9/23/13:09

引子

写程序难免需要错误处理,而为了把错误信息输出到标准错误中,通常会选择使用fprintf函数来打印错误信息。

#include <stdio.h>
int main(int argc, char const *argv[])
{
	int error_code = -1;
	fprintf(stderr, "error: %d\n", error_code);
	return 0;
}

为了方便观看,还可能使用彩色打印

fprintf(stderr, "\033[31merror:\033[0m %d\n", error_code);

显然在每个出错的地方都写上这么冗长的一句代码不仅观感非常差,而且一旦需要修改将会非常麻烦。

所以在思考写出这样一个函数:

void error(char* fmt, ...);

它能够像printf一样使用,但又能够将错误信息输出到标准错误中,还能够输出彩色的字符:

error("%d", error_code);
// 等价于↓
// fprintf(stderr, "\033[31merror:\033[0m %d\n", error_code);

实现

正好标准库中有一个非常适合实现这个功能的函数,它就是vprintf,当然它还需要和stdarg.h头中的仨哥们va_listva_startva_end配合一下:

void error(char const * const fmt, ...){
	va_list ap;
	va_start(ap, fmt);
	printf("\033[31m");  // 将字体转为红色
	printf("error: ");
	printf("\033[0m");  // 将字体转为默认颜色
	vprintf(fmt, ap);  // 这里才是真正打印错误信息的地方
	va_end(ap);
}

这样在主函数中就很方便的可以使用error函数打印错误信息了:

int main(int argc, char const *argv[])
{
	int error_code = -1;
	error("%d\n", error_code);

	error("this is an error message. ");
}

不过上面的error函数还没有把信息打印在标准错误中。

但就像printf有兄弟fprintf一样,vprintf也有它的兄弟vfprintf,只要把上面的vprintf(fmt, ap);替换为:

vfprintf(stderr, fmt, ap);

即可。

这个vprintfvfprintf可能是专门为套娃而生的。

完整示例

#include <stdarg.h>
#include <stdio.h>

void error(char const* const fmt, ...){
	va_list ap;
	va_start(ap, fmt);
	fprintf(stderr, "\033[31m");  // 将字体转为红色
	fprintf(stderr, "error: ");
	fprintf(stderr, "\033[0m");  // 将字体转为默认颜色
	vfprintf(stderr, fmt, ap);  // 这里才是真正打印错误信息的地方
	va_end(ap);
}

void warning(char const* const fmt, ...){
	va_list ap;
	va_start(ap, fmt);
	fprintf(stderr, "\033[35m");  // 将字体转为紫色
	fprintf(stderr, "warning: ");
	fprintf(stderr, "\033[0m");  // 将字体转为默认颜色
	vfprintf(stderr, fmt, ap);  // 这里才是真正打印错误信息的地方
	va_end(ap);
}

int main(int argc, char const *argv[])
{
	error("这是错误,错误代码%d\n", 100);
	warning("这是警告,警告代码%d\n", 200);
	return 0;
}

评论