包装器printf函数根据用户首选项进行过滤

我的程序写入日志和stdout。 但是,每条消息都有一定的优先级,用户在Preferences中指定哪个优先级转到哪个流(log或stdout)。

unsigned short PRIO_HIGH = 0x0001; unsigned short PRIO_NORMAL = 0x0002; unsigned short PRIO_LOW = 0x0003; 

首选项由一些标志处理:

 unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); unsigned short PRIO_STD = (PRIO_HIGH); 

write_log函数应该使用与printf函数相同的参数,并添加unsigned short priority参数。

 write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1); 

(即使PRIO_NORMAL|PRIO_LOW没有意义……)

检查标志很简单: if(priority & PRIO_LOG) (如果在两个参数中都设置了任何标志,则返回> 1)

但是,我不知道如何将字符串文字格式参数传递给printf函数。 任何人都可以帮助或给我一个指针(可能的替代方法可以实现相同的效果)? 非常感谢。

您想使用C的变量参数“ varargs ”function调用vprintf()而不是printf()。

 #include  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); } 

有关更多信息,请参阅此内容 。

我认为杰夫的想法是要走的路,但你也可以用宏来完成这个,而不使用vprintf。 这可能需要gcc:

 #define write_log(priority,format,args...) \ if (priority & PRIO_LOG) { \ printf(format, ## args); \ } 

点击此处查看有关其工作原理的信息。

如果要将PRIO_ *定义用作位(使用|和&),则必须为它们中的每一个赋予它自己的位:

 unsigned short PRIO_HIGH = 0x0001; unsigned short PRIO_NORMAL = 0x0002; unsigned short PRIO_LOW = 0x0004; 

可以使用do {} while(0)表示法来改进宏。 它使对write_log的调用更像是一个语句。

 #define write_log(priority,format,args...) do { \ if (priority & PRIO_LOG) { \ printf(format, ## args); \ } while(0)