3

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

不确定是否正确?查看 argsPrinter 中的评论

// 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 , ...);

4

4 回答 4

3

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

鉴于您拥有 C 函数的源代码,您也许可以更改它。

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

于 2013-09-16T15:43:23.737 回答
2

无法转发 C 风格的可变参数。这就是为什么两者都fprintf存在vfprintf。如果您需要转发它们,则必须创建自己的版本markFile,例如vmarkFile,它可以接受 ava_list而不是....

于 2013-09-16T15:44:30.300 回答
1

在 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
}
于 2013-09-16T16:00:26.250 回答
0

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

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

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

于 2013-09-16T15:54:45.160 回答