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)