私は可変数の引数をとる関数をC言語で書いています。C varargs - va_copyの問題
size_t myprintf(char *fmt, ...);
これまでのところ、とても良いです。 Right Way™のやり方を変えて、さまざまな議論をとるバージョンと、va_list
という別のバージョンを作るのがベストだと決めました。
size_t myprintf(char *fmt, ...);
size_t myvprintf(char *fmt, va_list args);
それほど難しくありません。 my_vprintf()
は、args
を2つの異なる関数(最初にsnprintf()
の長さで必要な部屋を決定するために、次にsprintf()
に割り当ててから)に送信する必要があります。私はva_copy
でこれを行います。
これはすべて上質でダンディーですが、C99は少し実装が不良です。可能であれば、私のコードはC89でも動作し、できるだけ多くのコンパイラと多くのプラットフォームで作業したいと思います。私は現在、#include <stddef.h>
後にこれを持っていますが、任意のコードの前に:
#ifndef va_copy
# ifdef __va_copy
# define va_copy(a,b) __va_copy(a,b)
# else /* !__va_copy */
# define va_copy(a,b) ((a)=(b))
# endif /* __va_copy */
#endif /* va_copy */
私は((a)=(b))
が信頼できない、と私は多分memcpy()
または類似のものを使用する必要があることと信じるように導かれていますが、これは「あなたの場合のレベルにまだありますC99をサポートしていない場合は、「C99をサポートしていない場合、恐れることはありません」よりもむしろ「うまくいく」ことを願っています。この制限を回避する良い方法はありますか?私はいくつかの解決策を見た - va_list
関数は1つの引数を受け取り、2つの別々のコピーが作成されるようにva_list
を2回通して機能する - しかし、それらがどれほどうまくいくかはわかりません(再帰的解決法は、私はちょうどvsnprintf()
に電話したいと思えば、うまくやれますか?)。
だから私はあなたに、StackOverflowユーザーを回します。私がC89との互換性を提供するために何かできることがありますか、またはva_copy
と__va_copy
(確かにごくわずかですが)のユーザーがいなくても、それを吸い取って取る必要がありますか?
2009年です。なぜC89互換性が必要なのでしょうか? – stepancheg
VC++はそれをサポートしていないため(おそらくはサポートしないため)私はそれを持っているのが好きです。私はそれが良いことだと思う。 –
私は、MSがレコードから実際に離れて、C99のために行くつもりはないと言っていると思いますが、顧客が望む奇妙な機能を選んで選択する点を除いては、 – KTC