我的程序写入日志和stdout。但是,每条消息都有一定的优先级,用户在Preferences中指定哪个优先级转到哪个流(log或stdout)。
unsigned short PRIO_HIGH = 0x0001;
unsigned short PRIO_NORMAL = 0x0002;
unsigned short PRIO_LOW = 0x0004;
首选项由一些标志处理:
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函数。任何人都可以帮助或给我一个指针(可能的替代方法可以实现相同的效果)?非常感谢。
答案 0 :(得分:38)
您想使用C的变量参数“varargs”功能调用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);
}
有关详细信息,请参阅this。
的内容答案 1 :(得分:6)
我认为杰夫的想法是要走的路,但你也可以用宏来完成这个,而不使用vprintf。这可能需要gcc:
#define write_log(priority,format,args...) \
if (priority & PRIO_LOG) { \
printf(format, ## args); \
}
检查here,了解其工作原理。
答案 2 :(得分:4)
如果要将PRIO_ *定义用作位(使用|和&amp;),则必须为它们中的每一个赋予它自己的位:
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)