C 包装器printf函数,根据用户偏好进行过滤
我的程序写入日志和标准输出。但是,每条消息都有一定的优先级,用户在首选项中指定哪些优先级流向哪个流(日志或标准输出) 首选项由一些标志处理:C 包装器printf函数,根据用户偏好进行过滤,c,filter,printf,wrapper,C,Filter,Printf,Wrapper,我的程序写入日志和标准输出。但是,每条消息都有一定的优先级,用户在首选项中指定哪些优先级流向哪个流(日志或标准输出) 首选项由一些标志处理: unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); unsigned short PRIO_STD = (PRIO_HIGH); write_log函数应使用与printf函数相同的参数,添加的参数为无符号短优先级 write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s
unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL);
unsigned short PRIO_STD = (PRIO_HIGH);
write_log
函数应使用与printf函数相同的参数,添加的参数为无符号短优先级
write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1);
(即使PRIO_NORMAL | PRIO_LOW
没有什么意义……)
检查标志很容易:if(priority&PRIO\u LOG)
(如果两个参数中都设置了任何标志,则返回>1)
但是,我无法找到如何将字符串文本和格式参数传递给printf函数。有谁能帮我或给我一个指针(可能指向另一种达到相同效果的方法)?非常感谢。您希望使用C的变量参数“”功能调用vprintf()而不是printf()
#include <stdarg.h>
int write_log(int priority, const char *format, ...)
{
va_list args;
va_start(args, format);
if(priority & PRIO_LOG)
vprintf(format, args);
va_end(args);
}
#包括
整数写入日志(整数优先级,常量字符*格式,…)
{
va_列表参数;
va_开始(参数,格式);
if(优先级和优先级日志)
vprintf(格式,参数);
va_端(args);
}
有关更多信息,请参见。我认为Jeff的想法是可行的,但您也可以使用宏而不使用vprintf来实现这一点。这可能需要gcc:
#define write_log(priority,format,args...) \
if (priority & PRIO_LOG) { \
printf(format, ## args); \
}
检查有关其工作原理的信息。如果希望将优先级定义用作位(使用|和&),则必须为每个优先级定义指定自己的位:
unsigned short PRIO_HIGH = 0x0001;
unsigned short PRIO_NORMAL = 0x0002;
unsigned short PRIO_LOW = 0x0004;
使用do{}while(0)表示法可以改进宏。它使写日志的调用更像一个语句
#define write_log(priority,format,args...) do { \
if (priority & PRIO_LOG) { \
printf(format, ## args); \
} while(0)
对不起,打字。当然,我是这样做的。谢谢你的指点+在视觉C C++中,你可以使用1的“VA”。参考:
#define write_log(priority,format,args...) do { \
if (priority & PRIO_LOG) { \
printf(format, ## args); \
} while(0)