私が使用しているコンパイラ (ARM 用の Codesourcery) には、va_arg() を壊すバグがあり、回避しようとしています。この場合、「ap」は、32 ビットおよび 64 ビット引数のリストへの単純なポインターです。コンパイラのバグは、va_arg() が壊れており、時々間違った値を返すことです。
va_list を任意の型のポインターにキャストし、それを使用してリストの値を取得できます。
void foo(va_list ap)
{
int32_t ival;
double dval;
ival = *(int32_t*)≈
dval = *(double*)&ap);
}
ただし、キャストタイプとしてインクリメント 'ap' をプリまたはポストするにはどうすればよいですか?
たとえば、これらの両方でエラーが発生します。
(int32_t*)&ap++;
++(int32_t*)&ap.
本当の「C」の達人が手を差し伸べてくれませんか? ユニオンを使用してポインターを操作するソリューションがありますが、もっと「C に値する」メソッドが必要です...