본문 바로가기

C,C++/C++51

sprintf 랩핑 버전 만들기 spirntf 함수는 사용자가 지정한 포맷 형태로 문자열을 만들어주는 함수이다. 이 함수를 랩핑하고 싶어서 만들다가 ...을 통해 받은 가변 인자 부분을 어떻게 sprintf에 넘겨줘야 할지 몰라서 찾아보았다. 그냥 sprintf에 넘기면 인자 부분이 쓰레기 값이 나왔다. 찾아 보니 sprintf가 아닌 vsprintf를 사용해야 한다. 해당 함수 버전도 wchar 버전, safe 버전 등 다양한 게 많기 때문에 필요한 것에 맞게 찾아 사용하면 된다. 나의 경우엔 다음의 문서를 참고하였다. https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/vsprintf-s-vsprintf-s-l-vswprintf-s-vswprintf-s-l?view=.. 2023. 7. 9.
Unity Build(유니티 빌드)란? C/C++에서 유니티 빌드라는 시스템이 있다. 여기서 유니티는 유니티 엔진의 유니티가 아니다. 여기서 유니티는 하나로 뭉쳐서 빌드한다는 뜻이다. C/C++과 같이 소스 파일이 헤더 파일을 포함하는 시스템의 경우 컴파일이 오래 걸릴 수 있다는 특징이 있다. 이러한 시스템의 빌드는 컴파일과 링크 과정으로 나뉘는데, 컴파일은 소스 파일(.cpp) 단위로 컴파일이 된다. 그런데 각 소스 파일들은 보통 헤더 파일을 include 한다. include는 단순히 컴파일 전에 컴파일러가 헤더 파일의 내용을 그대로 소스 파일에 복사하는 역할이다. 만약 10개의 소스 파일이 각각 동일한 헤더 파일을 모두 include하고 있다면 동일한 헤더의 내용이 10개의 소스 파일에 모두 복사가 되고, 10개의 소스 파일이 각자 컴파.. 2021. 11. 14.
2D vector size를 통해 초기화 하는 법 2D vector를 사용할 때 미리 크기를 정해주고 싶을 때가 있다. 그럴 땐 다음과 같이 한다. size_t row = 3; size_t col = 4; vector v{ row, vector(col, 1) }; 위 2D 벡터의 초기화 결과는 다음과 같다. 2021. 9. 9.
array를 소유하는 std::shared_ptr, deleter 설정법 C++ 17부터 std::shared_ptr가 [] 연산자를 지원한다. 따라서 ssptr[i]와 같은 연산을 지원한다. 이 의미는 (ssptr.get())[i]와 같은 의미이다. 즉 int* p = new int[5]에서 p[i]와 동일하다. 그러려면 std::shared_ptr ssptr(new int[5], deleter) 와같이 선언한다. 소유하려는 타입이 array일 경우 deleter를 지정하지 않아도 default_deleter가 자동으로 설정된다. deleter는 나중에 소유한 array의 메모리를 해제해준다. deleter를 직접 작성할 순 있지만 형태는 정해져 있는 듯 하다. template struct array_deleter { void operator()(T const* p) { d.. 2021. 2. 25.
[C++ 17] 템플릿 특수화보다 사용하기 좋은 if constexpr 함수 템플릿을 작성할 때 특정 타입일 경우 다른 행동을 정의하고 싶다. 이럴 때 템플릿 특수화를 사용했다. 그러나 C++ 17부터 if constexpr을 사용해서 타입에 따른 행동을 정의할 수 있다. 아래의 조건식은 타입 T가 MyClass 타입과 동일한지 판별한다. template void Func() { if constexpr (std::is_same_v) { // Do something... } } 위의 if문에서 컴파일 타임에 조건식이 true인지 false인지 판별한다. 따라서 아래와 같이 조건식에 변수는 올 수 없다. 컴파일 타임에 알 수 있는 결과값이여야 한다. template void Func() { int val = 3; if constexpr (val == 3) // compile e.. 2021. 1. 1.
[C++] placement new - 내가 원하는 메모리에 객체를 할당하고 싶다면 Placement new 내가 지정한 메모리에 객체를 초기화할 수 있을까? 메모리 풀을 만들다가 난항을 겪어 c++ 포럼에 질문을 남겼다가 새로운 기능을 알게 되었다. 그때 그때 생성할 객체의 타입이 달라서 오브젝트 풀보단, 메모리 풀을 만들고 그 메모리 풀에 객체를 할당하고 싶었다. 즉 다음과 같이 char 타입의 메모리를 생성해 놓고, 앞으로 생성할 객체들이 해당 메모리를 사용하면 좋겠다고 생각했다. 그리고 그런 것은 불가능할 줄 알았는데 가능했다. char* pMemoryPool = new char[1024]; size_t head = 0; A* pA = (A*)(pMemoryPool + head); head += sizeof(A); B* pB = (B*)(pMemoryPool + head); he.. 2020. 12. 25.