次のプログラムは64ビットLinuxマシンで動作しますが、32ビットLinuxマシンではクラッシュします。個数別にva_listを処理する
#include <cstdarg>
#include <iostream>
void proc_int(std::va_list va)
{
std::cout << va_arg(va, int);
}
void proc_str(std::va_list va)
{
std::cout << va_arg(va, const char*);
}
void outputv(std::va_list va)
{
proc_int(va);
std::cout << " ";
proc_str(va);
std::cout << "\n";
}
void output(int dummy, ...)
{
va_list va;
va_start(va, dummy);
outputv(va);
va_end(va);
}
int main()
{
output(0, 42, "hello");
}
私はva_list
が64ビットに32ビットが、struct __va_list_tag[1]
にchar*
であるためであると考えています。このプログラムを移植可能にするために、私はどのような変更を加えることができますか?outputv
の署名を変更することはできません。 cppreferenceから
ポインタで渡す:http://ideone.com/bhKalu –
@ n.m。 64ビットでは、エラー: '__va_list_tag **'を '__va_list_tag(*)[1] 'に変換できません。 – aschepler