std sprintf

std::string을 위한 sprintf 함수이다.

#include <string>
#include <cstdarg>
#include <memory>

std::string stringf(const char* format, ...)
{
    va_list args;
    va_start(args, format);
#ifndef _MSC_VER

    //GCC generates warning for valid use of snprintf to get
    //size of result string. We suppress warning with below macro.
    #ifdef __GNUC__
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wformat-nonliteral"
    #endif

    size_t size = std::snprintf(nullptr, 0, format, args) + 1; // Extra space for '\0'

#ifdef __GNUC__
    # pragma GCC diagnostic pop
#endif

    std::unique_ptr<char[]> buf(new char[size]);   //obj will be automatically deleted
    std::vsnprintf(buf.get(), size, format, args);
    return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
#else
    int size = _vscprintf(format, args);
    std::string result(++size, 0);
    vsnprintf_s((char*)result.data(), size, _TRUNCATE, format, args);
    return result;
#endif
    va_end(args);
}

int main() {
    float f = 3.f;
    int i = 5;
    std::string s = "hello!";
    auto rs = stringf("i=%d, f=%f, s=%s", i, f, s.c_str());
    printf("%s", rs.c_str());
    return 0;
}

윈도우즈 8에서 MinGW로 디폴트로 빌드해보자.
g++ "mytest.cpp" -o mytest

테스트 하면 다음의 오류가 뜬다.
"프로시저 시작 지점 . .....Dll.... mytest에서 찾을 수 없습니다."

스태틱 라이브러리로 빌드한다.
 MinGW의 gcc  빌드 옵션은 다음과 같다.

g++ "mytest.cpp" -o mytest -static-libgcc -static-libstdc++

참조)
https://stackoverflow.com/questions/2342162/stdstring-formatting-like-sprintf?page=2&tab=votes#tab-top