c - 如何检查是否在宏中从 C 设置了环境变量

标签 c macros environment-variables c-preprocessor

如果设置了环境变量,我想调用一个日志函数,有点像这样:

if(getenv("Log")){
    //Log("blah");
} else {
    //do nothing
}

除非,如果我将它定义为一个宏,那么它可能会更干净。

此外,对于 C 编码实践,这样做的正确方法是什么。

最佳答案

真的,将它集成到您​​的日志记录功能本身会更好。例如,此函数将检查环境变量,然后使用与 printf 相同的格式字符串记录到 stderr:

int debug_log(const char *fmt, ...) {
    char *env = getenv("DO_DEBUG_LOG");
    if(!env || !*env) return;
    // don't log if it is unset or a blank string
    else {
        va_list ap;
        va_start(ap, fmt);
        vfprintf(stderr, fmt, ap);
        va_end(ap);
    }
}

例如,这可以通过将环境变量解释为数字并传入一个数字作为日志条目的优先级来扩展(因此,如果它仅设置为 1,则不要打印具有 2 或更多)。

通常为此使用宏的程序是根据另一个宏而不是环境变量做出决定的。在这些情况下的优势是避免了非调试版本中函数调用的开销,您在这里并没有真正这样做,因为您每次都在调用 getenv。

关于c - 如何检查是否在宏中从 C 设置了环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31664905/

相关文章:

c - 测试预处理器符号是否在宏中定义

c - 我们为什么以及如何重定向调试语句?

timer - 如何在 systemd 计时器单元中使用环境变量?

windows - 如何在CreateProcess实例化的命令中使用或扩展环境变量?

c - 修改通过解析字符串文字创建的 cJSON 结构时出现段错误

c - 处理多种结构类型的队列 [C]

c++ - 有选择地仅对翻译单元的一部分禁用 GCC 警告

c - 将 cstring 作为参数传递,以便它可以被覆盖

c - 关于宏

linux - PATH 变量的默认值