在共享 library/DLL 中仅存储或检查 getenv() 的值一次

store or check value of getenv() only once in a shared library/DLL

我有一个打印调试日志的功能,它必须根据环境变量进行切换。与其在每次调用 print_trace() 时检查 env var,存储它并重用该值的最佳方法应该是什么?

void print_trace(const char* msg)
{
    const char* s = getenv("DEBUG_TRACE");

    if(!strcmp(s,"ON"))
      printf(msg);
}

没有main(),因为这是一个共享库。

您可以将决策结果保存在静态变量中。

void print_trace(const char* msg)
{
    static int debug_on = -1; // -1 == not yet set
    if (debug_on == -1) {
        const char* s = getenv("DEBUG_TRACE");
        debug_on = s && (strcmp(s, "ON") == 0);
    }

    if(debug_on)
      printf("%s", msg);
}

您可以使用 C11 中添加的线程安全 call_once 功能。

示例:

#include <threads.h>

static bool debug_mode;                   // your debug mode flag

void set_debug_mode(void) {               // this is only called once
    const char *s = getenv("DEBUG_TRACE");
    debug_mode = s && !strcmp(s, "ON");
}

void print_trace(const char* msg) {
    static once_flag flag = ONCE_FLAG_INIT;
    call_once(&flag, set_debug_mode);     // called once to set debug_mode

    if(debug_mode)
        printf(msg);
}