C++ で可変長引数を扱うときに va_list を使うと思いますが、これって再利用してはダメなんですね。知りませんでした。
#include <stdarg.h>
#include <iostream>
void f(const char* fmt, ...)
{
va_list va, va2;
va_start(va, fmt);
va_copy(va2, va);
// OK
char buf[256];
vsprintf(buf, fmt, va);
::std::cout << buf;
// OK
char buf2[256];
vsprintf(buf2, fmt, va2);
::std::cout << buf2;
// NG
char buf3[256];
vsprintf(buf3, fmt, va);
::std::cout << buf3;
va_end(va);
va_end(va2);
}
int main(void)
{
f("%d %d %d\r\n", 1, 2, 3);
return 0;
}
1 2 3
1 2 3
4198192 812910400 0
1 2 3
4198192 812910400 0
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
va_copy というのも初めて知りました。
Visual Studio だと va_copy は 2012 以前だとないようです。2013 では使えます。
ちなみに、Visual Studio だと上記コードでも問題なく動いたので環境依存ってことなんでしょうかね。
0 件のコメント:
コメントを投稿