0

そのようなコードを考えてみましょう:

#include <stdio.h>
#include <stdarg.h>

#ifdef debug
#undef debug
#endif

#define debug(format, ...) tpk(format, __VA_ARGS__)

void tpk(const char* format, ...)
{
  const unsigned int len = 1024;
  char buffer[len];
  va_list args;

  va_start(args, format);
  vsprintf(buffer, format, args);
  va_end(args);

  printf(buffer);
}


int main()
{
  debug("No, you don't! ",  "But I do! %d %s\n", 34, "blabla");
  return 0;
}

考慮事項:

デバッグするコードがいくつかあります。そのため、デバッグを undef にする必要があります (ヘッダーがプロジェクトに含まれる方法がめちゃくちゃなので、理由を聞かないでください)。

バッファ オーバーフローなどについて心配する必要はありません。これはデバッグのみを目的としています。

機能していないもの:

私はNo, you don't!メッセージを受け取るだけで、それだけです。ただし、メッセージから最初の引数を削除すると、debugうまく出力されます。ここで何が間違っていますか?

更新: 私はばかげた間違いを犯しました。書式設定パラメーターを持たない書式文字列を指定するため、すべてが正常に機能します。これに対する解決策は、関数を変更することです。

#define debug(str, format, ...) tpk(str, format, __VA_ARGS__)

str を出力し、その後 format で可変引数関数を使用します。

4

2 に答える 2

2

あなたが言っていることは、次のものと変わりません。

printf("No, you don't! ",  "But I do! %d %s\n", 34, "blabla");

それが何をするかわかりますか?

ヒント: フォーマット文字列は何ですか?

于 2013-07-18T11:02:23.483 に答える
2

関数への最初の呼び出しでdebug:

debug("No, you don't! ",  "But I do! %d %s\n", 34, "blabla");

最初の引数は、それを解析して置換するものを見つけようとするformat引数です。vsprintf置換するものが何も含まれていないため"No, you don't!"、残りのパラメーターは無視されます。

その部分を削除すると、"But I do! %d %s\n"含まれて%dおり、%sそれが置き換えられます。

于 2013-07-18T11:15:26.277 に答える