Programming/C++ & Unreal

Programming/C++ & Unreal

vprintf, vsprintf 등 가변 인자 함수를 활용한 로그 함수 개발 시에 포맷 warning 출력하기

printf C++에서 printf 사용시에 format을 잘못 지정하였다면 이렇게 컴파일러단에서 C4477 C4313 C6067 의 워링 에러가 발생하여 잘못된 포맷으로 인한 오류나 크래시를 방지 할 수 있다. vprintf, vsprintf... 하지만 보통 printf를 저렇게 사용하는 일은 거의 없다. 아래와 같이 보통 로그를 남기는 함수를 va_list를 사용하여 커스터마이징하곤 한다. (UE_LOG도..) 하지만 이렇게 사용하면 포맷 관련 warning이 발생하지 않아서 실수를 저지르기가 너무 쉽다. 해결법 MSVS에서는 저런 사용자 함수에서 포맷 체크를 하는 방법이 없어서 이렇게 편법으로 Debug 빌드 시에만 printf로 체크하는 방식이 가능하다. sizeof() 안에 있는 printf구..

Programming/C++ & Unreal

StackWalk64가 context에 의하여 Access violation를 유발

#include #include #include BOOL InitSymHandler(HANDLE hProcess) { if (SymInitialize(hProcess, NULL, TRUE)) { SymSetOptions(SYMOPT_LOAD_LINES); return TRUE; } return FALSE; } LONG WINAPI UnhandledExceptionHandler(EXCEPTION_POINTERS* exceptionInfo) { CONTEXT* context = exceptionInfo->ContextRecord; STACKFRAME64 stackFrame; memset(&stackFrame, 0, sizeof(STACKFRAME64)); stackFrame.AddrPC.Mode = Addr..

Programming/C++ & Unreal

C++ 가변인자(va_list)를 오버로딩 하지 말자.

#include #include void Print(const char* format, va_list args) { // 2번째 Print 함수에서 호출함 vprintf(format, args); } void Print(const char* format, ...) { // main 에서 호출함 va_list args; va_start(args, format); Print(format, args); va_end(args); } int main() { char a[] = "Hello "; char b[] = "world!"; Print("%s %s", a, b); // "Hello world!" 출력됨. return 0; } 위 코드는 아무 문제가 없다. 가변인자가 잘 들어가서 2번째 Print 함수 -> ..

Programming/C++ & Unreal

C++ parallel for_each (thread) exception

#include #include #include #include #include #include LONG WINAPI UnhandleExceptionHandler(_EXCEPTION_POINTERS* exceptionInfo) { std::cout

Programming/C++ & Unreal

C++ RTTI 구현

개요 RTTI는 Run Time Type Information의 약자로 프로그램이 실행된 시점에 Type을 알 수 있는 기능이다. 기본 #include using namespace std; class A { }; class B { }; int main() { A a; B b; cout

Programming/C++ & Unreal

Xcode tbb 설치

1. 터미널 실행 2. 터미널로 tbb 설치 brew install tbb 3. Xcode 프로젝트 파일 클릭 4. Build Settings에 Include, Lib Path 지정 5. Build Phases에 라이브러리 파일 링크 추가 끝 boost 설치도 거의 비슷한데, brew 말고 macPort 라는 것을 통해서 받았음.

Programming/C++ & Unreal

C++ 오브젝트풀 개선 with tbb

#pragma once #include #include #include template class CObjectPool{ public: CObjectPool(int size = 100){ _maxSize = size; for (int i = 0; i < _maxSize; ++i) { T* newObject = new T(); _qObjects.push(newObject); } } ~CObjectPool() { while (!_qObjects.empty()) { T* object; if( _qObjects.try_pop( object ) == true ){ delete object; } } _maxSize = 0; } // 오브젝트를 꺼낸다. T* PopObject() { T* retVal; // 꺼낼게 ..

Programming/C++ & Unreal

tbb concurrent bounded queue 차이

tbb에 있는, concurrent queue는 자주 썼었는데, concurrent bounded queue는 뭐하는 물건인고 궁금해서 찾아보았음. bounded queue (경계큐) - 용량을 지정 할 수 있는 큐 concurrent bounded queue(동시성 경계큐) - 용량을 지정하여 사용할 수 있는 멀티 쓰레딩 큐, 더이상 넣을 수 없거나 뺄 수 없으면 블락킹 된다. (try_push/pop 으로도 사용 가능) vs concurrent queue - 용량을 지정할 수 없고, 뺄 것이 없으면 실패한다. (애초에 pop 이라는 함수 자체가 없고, Try_pop 만 가능) #include #include using namespace std; int main(int argc, const char *..

Programming/C++ & Unreal

직렬화 라이브러리 완성!

혼자서 게임 서버를 처음부터 만들어보려고, 직렬화 라이브러리 부터 다시 만들었다. float, int, char, string, (multi)map, list, vector, array 등을 간단하게 매크로로 직렬화 하도록 구현 완료! 졸업 작품때, RPC를 만들면서 공부했던 매크로와 Template 기능을 여기서 다시 쓸 줄이야.. 프라우드넷을 모방해서 소켓 라이브러리를 만들어보려고 하는데.... C#에서만 써봐서 C++로 만드는 과정이 너무 힘들다. 그래도 언젠가 완성할 수 있겠지................

Programming/C++ & Unreal

C++ region

C#에서 Region을 매우 애용하는 편인데, 이 기능을 사용하면 IDE에서 소스를 용도에 따라 접고 펼수 있어서 넘 편하다. C++ 작업을 하면서 Region이 고팠는데, 찾아보니까 다음과 같은 방법으로 쓸 수가 있는 듯 하다. #pragma region 리전이름 void Test(){ // ... } #pragma endregion 리전이름 VS 2017에서는 됐었는데, 다른 IDE에서는 아마도 안 될듯 싶다. 출처 : https://stackoverflow.com/questions/9000479/equivalent-of-region-for-c

장형이
'Programming/C++ & Unreal' 카테고리의 글 목록