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 件のコメント:
コメントを投稿