私は約30個の可変関数を持っています。それぞれが最後の引数としてパスを受け入れます。例:
bool do_foo(struct *f, int q, const char *fmt, ...)
各関数で、展開された形式が特定のサイズ以下であることを確認する必要があります。そのため、同じコードのチャンクをコピーして貼り付けて、vsnprintf()
印刷されなかった文字数を確認し、errno
それに応じて設定して、書き込みを回避しています。
私がやりたいのは、これを行う関数を作成することです。これは、安全なサイズであることがわかっている静的に割り当てられた (拡張された) 文字列、または失敗時に新しく初期化された文字列を返し、NULL に対してチェックすることができます。チェックでは、文字列が絶対パスか相対パスかを判断する必要もあります。これは、文字列の安全なサイズに影響します。重複コードが多く、臭いがし始めています。
関数のエントリから別の関数に省略記号の内容を渡す方法はありますか? または、最初に呼び出してからヘルパー関数にva_start()
渡す必要がありますか?va_list
編集:
ヘルパーにを渡すことにまったく反対しているわけではありva_list
ません。他に何も存在しないことを確認したかっただけです。コンパイラーは可変引数の開始位置を理解しているように見えるので、それらを渡すようにコンパイラーに指示できるかどうか知りたかっただけです。