我应该在什么级别向stderr打印警告信息?

时间:2017-06-21 09:48:03

标签: c

当我进行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几乎相同?我认为这有点烦人。如果使用更高级别的嵌套,情况会更糟。但我不知道我应该在哪个级别打印最佳打印。

1 个答案:

答案 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(不要问我是否好,但试试看,如果你不喜欢它,寻找另一个...... - 或者如果你喜欢,继续我上面开始的事情。)

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