【问题标题】:forward argslist "..." from a c++ to c function将 argslist "..." 从 c++ 转发到 c 函数
【发布时间】:2013-09-20 20:05:47
【问题描述】:

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

不确定是否正确?看看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 , ...);

【问题讨论】:

标签: c++ c arguments wrapper


【解决方案1】:

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

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

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

【讨论】:

  • 可以改,这个函数我早就写过了,不确定vfprintf的存在,
  • 我做了更改,并考虑在c文件中添加一个新功能。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在 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
    }
    

    【讨论】:

      【解决方案4】:

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

      您也可以使用libffi。在man page 中查找可变参数函数调用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 2012-10-19
        • 2020-08-29
        • 1970-01-01
        • 2013-01-08
        • 2022-01-04
        • 2011-12-24
        相关资源
        最近更新 更多