在共享 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);
}
我有一个打印调试日志的功能,它必须根据环境变量进行切换。与其在每次调用 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);
}