1

可変長引数のデバッグ ログ出力機能に問題が 1 つあります。ここでコードをシミュレートします。

void SecondPrint(int level, const char* format,...)
{
   //Printing the log here
   va_list arg;
   va_start(arg, format);
   vprintf(format, arg);
   va_end(arg);   
}

void FirstPrint(int level, const char* format,...)
{
   SecondPrint(level,format);
}

void main()
{
   int level = 100;
   FirstPrintf("Log level = %d message = %s \n",level,"Error message");
}

「SecondPrint」は、期待どおり「100 エラー メッセージ」を出力するはずですが、そのように印刷されず、「エラー メッセージ」が出力されます。

私はこれで何が悪いのか分かりません。「FirstPrint」関数から「SecondPrint」を呼び出す方法を疑っています。FirstPrint は ... を介して残りの引数を受け取りますが、レベルとフォーマットの引数を指定して SecondPrint を呼び出します。

メインから SecondPrint を直接使用することはできません。FirstPrint を使用する必要があり、FirstPrint は SecondPrint を呼び出してログを印刷する必要があります。では、どうすればこれを達成できますか.. VA_ARGSを使用することを考えましたが、関数定義ではなくマクロ定義のみです。

そして、* #define FirstPrint(a,b,...) SecondPrint(a,b,...) *のようにできないことがもう 1 つあります。

事前に感謝します。

4

3 に答える 3

3

C varargs は、複数のレベルを渡すようには設計されていません。必要な種類の必要なスタック操作は、言語には深すぎます。通常、このような場合、類似したバージョンの--または類似のものを使用し、直接呼び出すのではなく、varargs を抽出した後に呼び出しSecondPrintます(一貫性のために、通常は内部で呼び出します)。vprintfSecondPrintVFirstPrintSecondPrintVSecondPrintSecondPrintSecondPrintV

于 2012-12-26T22:26:34.850 に答える
1

への引数にアクセスできるように、va_listにを渡す必要があります。SecondPrintFirstPrint

void SecondPrint(int level, const char* format, va_list args)
{
   //Printing the log here
   vprintf(format, arg);
}

void FirstPrint(int level, const char* format,...)
{
   va_list args;
   va_start(args, format);
   SecondPrint(level, format, args);
   va_end(args);
}

void main()
{
   int level = 100;
   FirstPrintf("Log level = %d message = %s \n",level,"Error message");
}
于 2012-12-26T23:44:18.087 に答える
1

特定のプラットフォーム固有の方法でそれを行うことも、(引数が同じ順序でまったく同じであるため) アセンブリを使用して、現在の関数フレームを呼び出す関数で「置き換える」ことも可能です。GCC には、関数と関数でそれを行うための拡張機能もあります (ただし、スタック引数データのサイズを計算する方法を理解する必要があります)。__builtin_apply_args()__builtin_apply()

于 2012-12-27T05:51:50.430 に答える