当我进行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_1
和err_lvl_2
几乎相同?我认为这有点烦人。如果使用更高级别的嵌套,情况会更糟。但我不知道我应该在哪个级别打印最佳打印。
答案 0 :(得分:1)
实际上,这些消息的信息量不大。你希望能够发现出现问题的地方 - 以及什么。因此,您根本不需要错误级别。想象一下,你在控制台上看到“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(不要问我是否好,但试试看,如果你不喜欢它,寻找另一个...... - 或者如果你喜欢,继续我上面开始的事情。)
为什么要切换水平?好吧,只要一切运行正常,您可能希望减少日志记录(为了获得更好的性能,更小的日志文件,......),但在开发/测试您的应用程序时,或者在以后出现问题的情况下,您可能需要有更详细的日志记录来跟踪错误...