C++ で可変長引数を扱うときに va_list を使うと思いますが、これって再利用してはダメなんですね。知りませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#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 件のコメント:
コメントを投稿