如何检查是否在宏中从 C 设置了环境变量
How to check if Environment variable is set from C in macro
如果设置了环境变量,我想调用一个日志函数,有点像这样:
if(getenv("Log")){
//Log("blah");
} else {
//do nothing
}
除非,如果我将它定义为宏,那么它可能会更干净。
此外,对于 C 编码实践,正确的方法是什么。
您可以定义宏,将 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;
}
真的,将它集成到您的日志记录功能本身会更好。例如,此函数将检查环境变量,然后使用与 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。
如果设置了环境变量,我想调用一个日志函数,有点像这样:
if(getenv("Log")){
//Log("blah");
} else {
//do nothing
}
除非,如果我将它定义为宏,那么它可能会更干净。
此外,对于 C 编码实践,正确的方法是什么。
您可以定义宏,将 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;
}
真的,将它集成到您的日志记录功能本身会更好。例如,此函数将检查环境变量,然后使用与 printf:
相同的格式字符串记录到 stderrint 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。