【问题标题】:How to add an extra argument to a C++ log macro如何向 C++ 日志宏添加额外参数
【发布时间】:2019-12-13 11:01:43
【问题描述】:

假设我有以下用于记录的宏

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' 打入日志? 有什么想法吗!?

【问题讨论】:

  • 宏扩展包括&lt;&lt;&lt;&lt; expands to func which logs to a file &gt;&gt;&gt;&gt;。为什么不修改“记录到文件的函数”?完全不需要修改宏。
  • 好吧,修改“记录到文件的函数”对我来说不是一个选项。

标签: c++ variadic-macros


【解决方案1】:

如果 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" 相同。

【讨论】:

  • 因为它实际上被标记为 C++(尽管到目前为止是纯 C),你可以使用(std::string{"IP %s"}+fmt).c_str。这也将连接普通的 C 字符串。
【解决方案2】:

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

现有 => TRACE(x, y)

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

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

这里VA_AGRS,以及tricks,可以提供帮助。

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2015-08-27
    • 2011-12-01
    • 2012-10-25
    相关资源
    最近更新 更多