2014年2月21日金曜日

[C++] va_list を再利用してはいけない

最近ハマったので備忘録。

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

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

va_copy というのも初めて知りました。
Visual Studio だと va_copy は 2012 以前だとないようです。2013 では使えます。

ちなみに、Visual Studio だと上記コードでも問題なく動いたので環境依存ってことなんでしょうかね。

0 件のコメント:

コメントを投稿