http://fmtlib.net/3.0.0/index.html

   

c, c++ 에서 프로그래밍을 할 때 printf, sprintf 등과 같은 함수들을 자주 사용하시죠?

로그를 남기거나 문자열을 조합하거나 할 때 전 보통 아래와 같이 쓰곤 했습니다.

   

std::string my_name = "simmanix";
int age = 26;  // 네.. 거짓말입니다... 20 대로 돌아가고 싶네요.. ㅜㅜ

char szMyInfo[256];
sprintf( szMyInfo, "name = %s, age = %d", my_name.c_str(), age );

   

그러다가 가끔 실수로

sprintf( szMyInfo, "name = %s, age = %d", my_name, age );

이렇게 해서 낭패를 보기도 하죠.(컴파일 에러가 안나죠 ;;;;)

조합할 내용이 많을 경우 %s,%d,%c,%u, 등등 타입에 맞게 순서를 지켜야 하는 번거로움도 있습니다.


그리고 저의 경우 format string 을 외부파일로 만들어서

c++ 프로그램과 c# 프로그램이 공용으로 사용해야하는 경우가 있었습니다.

이런 문제들을 해결해야 했고 그렇다고 직접 구현하기는 너무 귀찮았습니다.

(사실 능력이 부족합니다.. ㅜㅜ)

결국 구글링한 끝에 cppformat 이라는 라이브러리를 발견하고는 바로 적용했습니다.


cppformat 은 cross-platform 이며, c의 printf 방식으로도 사용할 수 있고 c# 방식으로도 사용할 수 있습니다.

간단하게 위에서 예를 들었던 코드를 cppformat 으로 써서 c# 방식으로 바꿔보겠습니다.


std::string my_name = "simmanix";
int age = 26;  // 네.. 거짓말입니다... 20 대로 돌아가고 싶네요.. ㅜㅜ
//char szMyInfo[256];

/*
sprintf( szMyInfo, "name = %s, age = %d", my_name, age );
std::string my_string = szMyInfo;
*/

std::string my_string = fmt::format( "name = {}, age = {}", my_name, age );


변화를 감지하셨나요?

%s,%d 가 없어지고 {},{} 로 대체되었습니다.

이제 자료형에 따른 %s,%d 사용 그리고 나열순서에서 해방될 수 있습니다.


이 외에 특별한 형태로 출력해야 하는 경우도 지원하고 있는데

자세한 설명은 link 로 대신하겠습니다.


http://fmtlib.net/latest/api.html

http://fmtlib.net/3.0.0/syntax.html


cppformat 은 window 및 linux 에서도 정상적으로 동작하는 것을 확인했습니다. 

+ Recent posts