将不同类型的参数与va_list分开

时间:2019-05-16 05:30:30

标签: c variadic-functions

我正在尝试编写一个获取信息并将其发送到另一个功能的宏,方法是将原始的va_list拆分为字符串,并从原始的va_list生成另一个va_list。

下面是我的代码。

调用宏

/* Usage */
PRINT_LOG("Format log = %d, %f, %s", 1, 2.7, "Test");

我的下面的代码

/* my includes here */
#include <stdarg.h>

void printInfo(int level, const char *debugInfo, ...); /* defined in 3rd party API */

void formatLogs(int level, ...);

#define PRINT_LOG(...) formatLogs(0, __VA_ARGS__)

void formatLogs(int level, ...)
{
  va_list args;
  va_start(args, level);

  /* get the first argument from va_list */
  const char *debugString = va_arg(args, const char*);

  /* here I want to get the rest of the variable args received from PRINT_LOG*/
  va_list restOfArgs = ???????; /* restOfArgs should be 1, 2.7, "Test" */

  /* Below I want to send the rest of the arguments */
  printInfo(level, debugString, args);
  va_end(args);
}

是否可以将va_list的一部分作为va_list发送到另一个函数?如果是这样,我该怎么办?

非常感谢您。

1 个答案:

答案 0 :(得分:1)

根据问题中的代码,最简单的操作是重新定义宏,如下所示:

// ContractorEvent Model
'use strict';
module.exports = (sequelize, DataTypes) => {
  const ContractorEvent = sequelize.define('Event', {
    reason: DataTypes.STRING,
    escort: DataTypes.STRING,
    // other fields
    //...

  }, {});
  ContractorEvent.associate = function(models) {
    // associations can be defined here
    ContractorEvent.belongsTo(models.Employee);
  };
  return ContractorEvent;
};

并完全跳过中间功能。因为您尝试做的事情无法做到那样。

#define PRINT_LOG(s, ...) printInfo(0, s, __VA_ARGS__) 变量自变量省略号不是一个, ...)。在调用va_list之前,传递给函数的变量参数不会实现为va_list。要传递va_start作为函数参数,该函数的签名中必须带有va_list,如下所示:

va_list