「va_listで提供された番号を保持する」についてあなたが説明することは、これにアプローチする方法です。
は、スタック上の一時メモリへのva_list
ポインタを維持します(C標準ではいわゆる「自動ストレージ」)。変数argsを持つ関数が返されると、この自動ストレージはなくなり、コンテンツは使用できなくなります。このため、それ自体のコピーを単純に保持することはできませんva_list
。参照するメモリには、予測できないコンテンツが含まれます。
与えた例では、そのメッセージを再作成するときに再利用される2つの整数を格納する必要があります。処理する必要のある異なるフォーマット文字列の数に応じて、アプローチは異なる場合があります。
完全に一般的なタイプのアプローチでは、次のことを行う必要があります。
cache_arguments()
変数引数で見つかった値の動的メモリバッファを作成する" "関数を記述します。
- これは、、、マクロとともに-styleフォーマット文字列
cache_arguments()
を使用します。型指定子に従って型を取得する必要があります。printf()
va_start
va_arg
va_end
printf()
sizeof(double) != sizeof(int)
- プラットフォームで期待されるのと同じ配置とパディングを使用して、引数をメモリキャッシュに格納し
va_arg()
ます。varargs.h
(ファイルを読んでください。)
vsnprintf()
によって作成されたポインタの代わりに、このキャッシュされたメモリバッファを操作するための呼び出しを取得しますva_start()
。
上記の項目はすべて、LinuxやWindowsを含むほとんどのプラットフォームで可能です。
翻訳について検討したい項目は、語順の問題です。英語で書かれているもの:
プレーヤーサムは20ポイントを獲得しました。
一部の(人間の)言語では、次の語順に類似した語順でのみ流暢に書くことができます。
プレイヤーサムは20ポイントを獲得しました。
このため、Win32 FormatMessage()
APIは-のprintf()
ようなフォーマット文字列を使用しますが、次のようにパラメータに番号が付けられるという機能上の違いがあります。
プレイヤー%1は%2!d!を獲得しました ポイント。
%2!d!ポイントはプレイヤー%1によって獲得されました。
(文字列型は引数ごとに想定されるため、%1
と同等です%1!s!
)
もちろん、Win32 APIを使用していない場合もありますが、フォーマットされた引数の語順を変更する機能は、私が概念として紹介しようとしているものです。これをソフトウェアに実装することもできます。