gpt4 book ai didi

c - 打印错误信息

转载 作者:太空狗 更新时间:2023-10-29 16:00:04 24 4
gpt4 key购买 nike

我只是想知道制作自定义打印错误函数的最佳方法是什么。

例如我在头文件中有一些像这样的#defines:

#define SOCKET_ERR 0
#define BIND_ERR 1
#define LISTEN_ERR 2
etc

然后也许像这样使用它:

if(/*something has gone wrong with socket*/)
{
print_error(SOCKET_ERR);
}

print_error(int error)
{
if(error == 0)
{
printf("Socket failure\n");
}
}

但是,我认为这并不完美,我想做得更好。也许更专业一点,也许更具可扩展性。

非常感谢任何建议,

最佳答案

您可以考虑使用 variadic functions对于错误报告,它们变得更加通用。

例如

#include <stdarg.h>
void my_error(FILE *out, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(out, fmt, ap);
va_end(ap);
}

可以这样调用(注意,我假设是 c99 编译器):

my_error(stderr,
"%s: Invalid range of %ld near line %d", __func__, range, __LINE__);

这可以很容易地与其他答案结合起来,这些答案表明可以在枚举列表中定义错误代码,并使用常量字符串数组来翻译它们。我将把它留给读者作为练习。很容易让上面的例子接受更多的参数。

注意:如果您使用 char buffer[LEN] 之类的东西来自定义打印字符串的格式,请将其从 void 更改为 unsigned int,让它返回 vsnprintf() 无法打印的字节数,这可能对调用者,召集者。上面的示例是“安全的”,其中您不必担心使用未定义长度的格式化错误消息溢出一些堆栈分配的缓冲区。或者,将其保留为无效并让它打印它可以打印的内容(同时注意它无法打印所有内容),由您决定。这种方法的缺点是不太清楚展开后可变参数的长度。毕竟,您报告的是意想不到的结果:)

这种方法可以让您通过传达有意义且信息丰富的错误消息以及简单地将它们记录到任何打开的文件中来帮助自己。

我知道这个例子基本上描述了 printf() 本身。我发布它是为了展示适应和扩展是多么容易。

关于c - 打印错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1679117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com