gpt4 book ai didi

c - 我应该将什么级别的警告信息打印到 stderr?

转载 作者:行者123 更新时间:2023-11-30 14:56:26 25 4
gpt4 key购买 nike

当我进行C编程时,我想打印一些特殊情况的警告,以使程序更加健壮。然而,我经常遇到这样的情况:

float a(...) {
float *p = NULL;
if (p == NULL) fprintf(stderr, "err_lvl_2");
...;
}

float *b(...) {
float *p;
...;
p = Cal(...);
if (p == NULL) fprintf(stderr, "err_lvl_1");
...
return p;
}

警告信息err_lvl_1err_lvl_2几乎相同?我觉得这有点烦人。如果使用更高级别的嵌套,情况会更糟。但我不知道应该在哪个级别进行最佳打印。

最佳答案

实际上,这些消息的信息量并不大。您希望能够发现哪里出了问题以及出了什么问题。因此你根本不需要错误级别。想象一下,您在控制台上看到“err_lvl_1”,但您在应用程序中的许多不同位置使用了它......

您最好提供更具体的信息,例如:

fprintf(stderr, "(%4u) %s: p == NULL\n", __LINE__, __func__);

您可以将其放入宏中,以便获得统一的日志记录:

#define LOG(FORMAT, ...) \
fprintf(stderr, "(%4u) %s: " FORMAT "\n", __LINE__, __func__, ## __VA_ARGS__);

LOG("value of x was %d", x);

(请注意,上面的 ## 是针对没有可变参数的情况的 GCC 扩展,它将跳过逗号 - 其他编译器可能需要不同的解决方案...)

当然,你可以选择更隐晦的措辞,试图向用户隐藏内部情况,只要你能快速得到你需要的东西......

级别(如果可用)通常用于在编译时或程序运行时(或两者结合,如下所示)打开(或关闭)更详细的日志记录:

#define LEVEL_NONE  0
#define LEVEL_FATAL 1
#define LEVEL_ERROR 2
// WARNING, INFO, DEBUG, TRACE, ...

#if STATIC_LOG_LEVEL < LEVEL_ERROR
#define LOG_ERROR(FORMAT, ...)
#else
#define LOG_ERROR(FORMAT, ...) \
do \
{ \
if(currentLevel >= LEVEL_ERROR) \
fprintf(stderr, "(%4u) %s: " FORMAT "\n", __LINE__, __func__, ## __VA_ARGS__) \
} \
while(0)
#endif

您可以打印到一个文件,而不是打印到 stderr – 瞧,您刚刚启动了一些最小的日志系统...您不需要从一开始就发明它,但是,有足够的它们已经存在,例如 log4c ,例如(不过,不要问我它是否好 – 尝试一下,如果您不喜欢它,请寻找另一个... – 或者如果您喜欢,请继续我上面开始的操作)。

为什么要切换级别?好吧,只要一切运行良好,您可能希望减少日志记录(为了更好的性能、更小的日志文件……),但是在开发/测试您的应用程序时或者在以后出现问题的情况下,您可能希望有更详细的日志记录来跟踪错误...

关于c - 我应该将什么级别的警告信息打印到 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44672595/

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