25

我的程序写入日志和标准输出。然而,每条消息都有一个特定的优先级,用户在 Preferences 中指定哪些优先级转到哪个流(日志或标准输出)。

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 函数。任何人都可以帮助或给我一个指针(可能是达到相同效果的替代方法)?将不胜感激。

4

3 回答 3

59

您想使用 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);
}

有关更多信息,请参阅与此类似的内容。

于 2009-10-04T13:15:50.487 回答
9

我认为 Jeff 的想法是可行的方法,但您也可以使用宏而不使用 vprintf 来完成此操作。这可能需要 gcc:

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

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

于 2009-10-04T18:42:15.990 回答
4

如果您希望将 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)
于 2009-10-05T15:45:16.463 回答