如何检查环境变量是否从宏中的C设置

时间:2015-07-27 23:16:23

标签: c macros environment-variables c-preprocessor

如果设置了环境变量,我想调用日志记录函数,如下所示:

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

除非我将它作为宏定义,否则它可能更清晰。

此外, C 编码实践的正确方法是什么。

2 个答案:

答案 0 :(得分:3)

真的,将它集成到日志功能本身会更好。例如,此函数将检查环境变量,然后使用与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,所以您实际上并没有这样做。

答案 1 :(得分:2)

您可以定义宏,在其中封装if语句。这可以这样做:

#include <stdio.h>
#include <stdlib.h>

#define LOG_ENV(s)           \
    do {                     \
        if (getenv("Log"))   \
            Log(s);          \
    } while(0)

static void Log(const char *str)
{
    puts(str);
}

int main(void)
{
    LOG_ENV("blah");

    LOG_ENV("meh");

    return 0;
}