【问题标题】:Adding extra arguments to a variadic argument function's va_list in c c++在 c c++ 中向可变参数函数的 va_list 添加额外参数
【发布时间】:2019-01-04 18:34:41
【问题描述】:

我有一个库定义的函数,我无法更改,也无法更改它的调用方式。 函数有点像这样:

void originalFunction(const char *file, int line, error_type msg, const char* tag, ...);

此函数将调用以下方式定义的库:

void originalFunction(const char *file, int line, error_type msg, const char* tag, ...){
  va_list ap;
  va_start(ap, tag);
  ...
  vExtIssueMessage(msg, ap);
  ...
  va_end(ap);
}

我需要做的是在变量参数列表的末尾添加一些额外的参数。在这种特殊情况下,我想将文件和行附加到参数列表中,因为我不能只调用:

vExtIssueMessage(msg, ap, file, line);

因为那会破坏函数的签名。

【问题讨论】:

    标签: c++ macros variadic-functions


    【解决方案1】:

    解决方案是使用宏。 您可能知道也可能不知道,宏基本上会在某些预处理阶段对您的代码进行字符串替换。

    解决这个问题:

    #define originalFunction(arg1, arg2, args...) intermediateFunction(arg1, arg2, args)
    #define intermediateFunction(file, line, args...) originalFunction2(file, line, args, file, line)
    void originalFunction2(const char *file, int line, error_type, const char*, ...);
    

    您可能会注意到我在那里使用了 2 个不同的宏。 这是由于某些函数调用使用了另一个不会被扩展的宏,所以编译器会出错,告诉我我有一个 X 参数的函数,我给它 X-2 个参数。 使用中间宏时,您会强制预处理器扩展内部宏,从而为您提供所需的结果。

    您可能还注意到我使用了args...,然后将它们称为args,而不是C++ 中的常用方式function(arg1, arg2, ...),然后在右侧将那些'...' args 命名为__VA_ARGS__宏。 这只是为了让它对眼睛更友好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多