반응형
C/C++로 로그(log) 같은 함수를 만들거나 변수들을 문자열로 만들고 싶을 때가 있다. 이런 때 쉽게 사용할 수 있는 함수이다. 여기서는 기본이 되는 함수의 소스를 소개할까 한다.
아래 함수는 wstring을 string으로 wchar_t을 char로 _vsnwprintf_s을 char용으로 수정하면 string용으로 수정할 수도 있다. _vsnwprintf_s은 윈도우용 API인 관계로 Linux 혹은 Unix에서는 해당 OS에 맞는 함수로 수정하면 Linux나 Unix에서 사용할 수 있다. 여기서는 소스가 복잡해지는 관계로 string용이나 윈도우 외의 OS용으로는 만들지 않았다. 또한 다른 가변 인자 함수에서의 사용을 위하여 주요 로직을 가지고 있는 함수의 인자는 va_list로 처리하였다.
std::wstring format(const std::wstring fmt, va_list args)
{
int size = ((int)fmt.size()) * 2;
wchar_t* buffer = nullptr;
while (true)
{
if (buffer != nullptr)
{
delete[] buffer;
}
buffer = new wchar_t[size + 1];
int n = _vsnwprintf_s(buffer, size+1, size, (wchar_t*)fmt.c_str(), args);
if (-1 < n && n < size)
{
break;
}
else
{
size *= 2;
}
}
std::wstring result = buffer;
delete[] buffer;
return result;
}
std::wstring format(const std::wstring fmt, ...)
{
va_list args;
va_start(args, fmt);
std::wstring result = format(fmt, args);
va_end(args);
return result;
}
반응형
'C++ 프로그래밍' 카테고리의 다른 글
C++ static_assert (0) | 2021.10.30 |
---|---|
error C3520: 'args': 이 컨텍스트에서 매개 변수 팩을 확장해야 합니다. (0) | 2021.10.28 |
C++ optional의 활용 (0) | 2021.10.24 |
C++에서 stderr로 출력하기 (0) | 2021.10.11 |
More C++ Idioms (0) | 2017.02.19 |
64Bit Programming Models: Why LP64? (0) | 2009.08.22 |
C++ Technical Report 1 : Regular Expressions (0) | 2009.07.31 |
C++ Technical Report 1 : Random Number Generation (0) | 2009.07.30 |