将参数列表"..."从 C++ 转发到 C 函数

forward argslist "..." from a c++ to c function

本文关键字:函数 转发 参数 列表 C++      更新时间:2023-10-16

将参数列表从C ++类成员函数转发到c函数(我正在创建的包装器)

不确定是否正确? 查看 args打印机内部的评论

// c++ a class function
void argsPrinter( const char *format , ... ){
   //markFile(&mApiObj, format , ...); how to pass forward the ... to the c function
/*
va_list args;
va_start (args, format);
markFile(&mApiObj, format , args);
va_end(args);
*/
}
// c function
void markFile(someCustomApi* a, const char *format , ...)
{
   FILE *file= fopen(a->somePath, "a");
   if(file)
   {
     va_list args;
     va_start (args, format);
     vfprintf(file, format, args);
     va_end (args);
     fclose(file);
   }
//else do nothing
}

编辑实现发生了变化,但是,我可能会考虑实现附加功能,如果不允许转发到...

作为markFile(&mApiObj, format , ...);

你不能。如果包含markFile的库不提供markFileV(类似于vsprintfsprintf的对应物),则无法执行此操作。

不过,鉴于您拥有 C 函数的来源,您也许可以更改它。

附带说明一下(如果您对 C 代码有任何影响),这可能是一个简化的示例,但为什么markFile首先格式化为缓冲区(即 PATH_MAX 个字符长,所有事情!这和什么有什么关系?然后用fprintf写出结果?为什么不直接使用vfprintf

不可能

转发 C 风格的可变参数。这就是为什么fprintfvfprintf都存在的原因。如果您需要转发它们,则必须创建自己的markFile版本,例如 vmarkFile ,它将接受va_list而不是...

在 C 函数的实现中调用您的 C++ 函数怎么样?

例如您的C++函数

void argsPrinter( const char *format , ... ){
   //markFile(&mApiObj, format , ...); how to pass forward the ... to the c function
   /*
   va_list args;
   va_start (args, format);
   markFile(&mApiObj, format , args);
   va_end(args);
   */
}

您可以通过调用 C 函数来实现它:

void markFile(someCustomApi* a, const char *format , ...)
{
   a->argsPrinter(format, ... );
   //else do nothing
}

由于它高度依赖 ABI,因此您不能轻易做到这一点。

或者,您可以使用libffi。在手册页中查找可变参数函数调用。

我仍然建议您编写一个接受va_list作为参数的函数,例如 vsprintf 和 co。