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提供しない場合 (の対応物であるのmarkFileVと同様)、これを行うことは不可能です。vsprintfsprintf

ただし、C 関数のソースがあれば、それを変更できる場合があります。

余談ですが (C コードに何らかの影響を与えている場合)、これは縮小された例かもしれませんが、markFile最初にバッファーにフォーマットするのはなぜですか (何よりもPATH_MAXchars の長さです! それは何と関係があるのでしょうか? ) を使用fprintfして結果を書き出しますか? vfprintf直接使用しないのはなぜですか?

于 2013-09-16T15:43:23.737 に答える
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 に答える