반응형

분류 전체보기 230

C/C++ __FUNCTION__, __FILE__의 유니코드 버전

유니코드를 출력하는 wcout이나 유니코드를 인자로 요구하는 함수와 같은 경우 __FUNCTION__, __FILE__이 제대로 출력되지 않습니다. 구글링 해보면 #define을 이용하여 새롭게 정의하여 출력하는 방식이 나와 있습니다. 처음에는 그렇게 사용했는데 비주얼스튜디오와 같은 경우(현재 2019 이용) 해당 __FUNCTION__, __FILE__의 유니코드 버전인 __FUNCTIONW__, __FILEW__을 corecrt.h에서 정의하고 있었습니다. 어느 버전부터 지원하는 지는 모르겠지만 최신 비주얼 스튜디오를 사용하신다면 그냥 __FUNCTION__, __FILE__을 유니코드로 사용하여야 한다면 __FUNCTIONW__, __FILEW__을 사용하시면 됩니다.

C++ 프로그래밍 2021.11.01

C++ invoke_result: return type 알아내기

invoke_result는 C++ 17부터 추가된 함수의 리턴 타입을 알아내는데 사용되는 함수 입니다. 기존에는 C++ 11에 추가된 result_of가 사용되었는데 C++ 20에서 삭제된 관계로 더 이상 result_of는 사용할 수 없습니다. 해당 함수는 템플릿을 프로그래밍을 할 때 사용할 수 있는 함수인 관계로 일반적인 프로그래밍에는 별로 사용되지 않을 듯 보입니다. 사용법은 invoke_result::type 입니다. 비주얼 스튜디오에서 제대로된 인자를 넣지 않을 경우 인텔리센스에서 멤버로 type이 나오지 않습니다. 아래 예제는 std::result_of, std::invoke_result(https://en.cppreference.com/w/cpp/types/result_of)을 응용하여 작성..

C++ 프로그래밍 2021.10.31

C++ static_assert

C++ 11에 추가된 것으로 기존 assert이 실행 시간에 오류를 검증하는데 비하여 static_assert은 컴파일 타임에 오류를 검증합니다. static_assert은 컴파일 타임에 오류를 검증할 수 없는 변수 값을 대입하는 경우 상수 값이 있어야 한다는 오류를 냅니다. 이런 특성을 가진 관계로 주로 템플릿 프로그래밍에서 타입 체크 등에서 사용됩니다. 비주얼 스튜디오에서는 코드 작성 중에 static_assert이 false일 경우 표시를 해주어서 편합니다. 사용 예는 아래와 같습니다. static_assert(1

C++ 프로그래밍 2021.10.30

Unity 스크립트 수정 후 스크립트 관련 대화상자 뜨는 시간 줄이기

Unity 스크립트를 비주얼 스튜디오에서 수정 및 저장 후 Unity로 돌아오면 Reload Script... 혹은 Hold... 와 같은 타이틀을 가진 스크립트 관련 대화상자가 뜨면서 기다리게 됩니다. 비주얼 스튜디오에서 수정 및 저장한 후에 솔루션 빌드를 하고 Unity로 돌아오면 해당 대화상자가 뜨지 않거나 상대적으로 짧은 시간 뜨는 것을 확인할 수 있습니다. 솔루션 빌드 시간은 Unity가 변경된 스크립트 관련 처리를 하는 시간에 비하여 상대적으로 적은 시간 만을 필요로 합니다. 작은 팁이지만 해당 방법은 실제적으로 개발 시간을 많이 줄여줄 수 있습니다.

error C3520: 'args': 이 컨텍스트에서 매개 변수 팩을 확장해야 합니다.

가변 인자를 받는 함수에서 가변 인자들을 가변 인자를 받는 다른 함수를 호출할 때 ...를 생략할 때 발생할 수 있습니다. 에러가 발생하는 아래 예제 코드를 살펴보겠습니다. template void thread_log_t(const std::wstring fmt, arguments ... args) { wstring str = format_string(L"thread[%d]: ", std::this_thread::get_id()); str += format_string(fmt, args ...); str += wend_line; wcout args ... 와 같이 가변 인자를 제대로 넘기면 에러가 해결됩니다. 가변 인자를 넘기기 위하여 ...가 추가되었다는 것에 주의바랍니다. 해당 에러가 수정된 코드 예..

C++ 프로그래밍 2021.10.28

boost asio io_service(io_context)의 poll과 run의 활용

boost asio io_service(io_context)를 통하여 이벤트를 호출하는 방식은 크게 poll과 run으로 나눈다고 할 수 있습니다. 간단히 두 방식을 살펴보면 아래와 같습니다. poll은 이름 그대로 poll방식으로 이전 poll 호출 후 쌓인 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽에 넘깁니다. run은 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽으로 넘기지 않고 다음 이벤트를 기다립니다. poll로 run을 구현한다고 한다면 아마 아래와 같은 코드가 될 것입니다. while(true) { poll(); } 서버에 연결하는 클라이언트에서 사용된다면 아마도 poll이 좋은 선택이 될 것입니다. 문제는 서버와 같은 경우는 이 두가지 중 어느 방식을 사용할지는 서..

boost asio io_service(io_context)의 이해 및 활용

boost asio에서 io_service(io_context)는 객체의 이벤트 처리를 담당합니다. 이 객체는 좀 더 자세히 보면 실제적으로 socket과 바인드 되어 socket의 이벤트 처리를 담당합니다. 이 객체는 OS kqueue, /dev/poo/, epoll, iocp와 같은 비동기 socket IO나 select와 같은 동기 IO를 해당 객체를 호출한 쓰레드에서 이벤트를 처리하도록 직렬화합니다. 이를 활용하는 방법을 살펴보겠습니다. io_service(io_context)는 socket에 바인드 되는 관계로 socket 이벤트 처리 그룹을 만들 수 있습니다. io_service1(io_context)에는 socket1, socket2를 바인드하고 io_service2(io_context)에는..

C++ optional의 활용

C++ 17에 추가된 유용한 클래스 중에 optional이 있습니다. 해당 객체는 값을 리턴할 때 값이 없음을 표현하기에 유용합니다. 예제로 optional의 활용을 살펴보기로 하겠습니다. 참고로 optional을 사용하기 위해서는, 즉 아래 예제 코드를 컴파일 하기 위해서는 컴파일러에서 C++ 17 표준을 지원해야 하며 Visual Studio 컴파일러 같은 경우 C++ 17을 지원하기 위한 컴파일 옵션을 설정하여 주어야 합니다. #include #include #include using namespace std; class test_optional { private: vector data_{ 10, 20, 30 }; public: int getByIndex1(int index) { if (index ..

C++ 프로그래밍 2021.10.24

Unity 정적(Static)객체를 전역 변수처럼 활용하기

개인적으로 사용하는 정적 클래스의 예는 아래와 같습니다. public static class Global { public static bool IsDev { get { #if DEV return true; #else return false; #endif } } public static NextStageMode ModeForNextStage { get; set; } public static int Stage { get; private set; } = 1; public static bool IsBossStage { get { return (Stage % 10 == 0); } } } 이 객체는 예로 유니티 어느 곳에서나 Global.IsDev와 같이 사용할 수 있습니다. 정적 객체는 씬과 함께 로드되고 삭제되..

Unity 싱글톤(Singleton)의 이해

Unity에서의 싱글톤은 일반적인 C#에서의 코드와는 다르며 일반적인 코드는 아래와 같습니다. public class Settings : MonoBehaviour { private static Settings inst_ = null; public static Settings Inst { get { return inst_; } } private void Awake() { if (inst_ == null) { inst_ = this; DontDestroyOnLoad(gameObject); } else { if (inst_ != this) { Destroy(gameObject); } } } } 위의 코드에서 보면 알 수 있듯이 처음 인스턴스를 만들 때는 gameObject에 대해서 DontDestroyOnLo..

C++ boost json용 라이브러리(boost.json)

boost 1.75 이전 버전은 json을 사용하기 위하여 property_tree를 사용하였습니다. 1.75 버전부터 json을 전문적으로 지원하는 boost.json라이브러리가 생겼습니다. boost.json을 사용하는 Hello World입니다. #include #include #include using namespace boost; using namespace std; int main(int argc, char* argv[]) { json::value jv = { { "Hello", "World" } }; std::string str = json::serialize(jv); cout

반응형