如何向 C++ 日志宏添加额外参数

How to add an extra argument to a C++ log macro

假设我有下面的日志记录宏

TRACE(类型、子类型、消息、fmt、args);

现在我有一个要求打额外的参数,说这个日志的机器IP:

#include <conio.h>

char *IP = "100.200.200.100";
#define TRACE(type, sub-type, message, fmt, args) do{ <<<< expands to func which logs to a file >>>> }while(0)

#define NEW_TRACE(type, sub-type, message, fmt, args) do { \
        TRACE (type, sub-type, message, fmt, ##args); \
    } while (0)

int main()
{
    char *w = "world!";
    NEW_TRACE("my-type", "my-subtype", 2, "Hello %s", w);
    return 0;
}

如何编写 NEW_TRACE 以便将 'IP' 打入日志? 有什么想法吗!?

如果 fmt 始终是字符串文字,这应该有效:

#define NEW_TRACE(type, sub-type, message, fmt, args) do { \
        TRACE (type, sub-type, message, "IP:%s " fmt, IP, ##args); \
    } while (0)

(免责声明:未经测试)

在 C++ 中,与 C 一样,您可以直接连接字符串文字,"part1" "part2""part1part2" 相同。

您可以将带有可变参数的宏扩展到宏。

现有 => TRACE( x, y)

扩展 => TRACE( x, y, ...)

e.g. #define TRACE(fmt, ...) printf(fmt, ##__VA_ARGS__)

这里VA_AGRS, as well as tricks,可以帮到你。