본문 바로가기

프로그래밍 언어/C, C++8

[C/C++] 구조체 비트필드(bit-field) C/C++: 구조체 비트필드 비트필드에 대한 쉽고 간단한 설명을 찾는다면 코딩도장에 잘 정리되어 있으니 먼저 한 번 읽어보는 것을 추천한다. C 언어 코딩 도장: 56.1 구조체 비트 필드를 만들고 사용하기 (dojang.io) 비트 필드에 대해 찾게 된 이유 언리얼 엔진을 공부하다가 대체 헤더 파일에서 싱글 콜론(:)이 왜 나오는지 궁금했다. 처음에는 언리얼 엔진만의 문법이라 생각했는데 아무리 검색해 봐도 이에 대한 설명이 없었다. // 멤버 변수에 대한 헤더 파일 코드 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character) uint8 bIsIdle : 1; UPROPERTY(EditAnywhere, BlueprintReadOnly, Cate.. 2024. 2. 24.
Program:Win32/Wacapew.C!ml : Windows 11에서 멀쩡한 C언어 파일이 트로이 목마로 착각되는 문제(MinGW) 환경: VSCode, MinGW(MinGW - Minimalist GNU for Windows download | SourceForge.net) 멀쩡한 C언어 코드가 갑자기 실행이 안 되는 문제가 생겼습니다. 방화벽이 코드를 보고 트로이목마(Win32/Wacapew.C!ml)로 의심한 것 같습니다. 결론만 말하자면 방화벽이 잘못 탐지한 것이기 때문에 걱정하지 마시고 실행해도 됩니다. 다만 트로이목마로 의심받은 실행파일이 삭제되는 문제가 있으니 방화벽에서 해당 폴더를 검사 예외로 설정합시다. 문제를 일으킨 코드는 다음과 같습니다. #include #include struct normal_struct { unsigned int a : 1; unsigned int b : 2; unsigned int c : 5.. 2024. 2. 24.
[C++] 레퍼런스, const 레퍼런스 반환 / 레퍼런스와 임시 개체의 수명 C++ Return value, reference, const reference C++ Return value, reference, const reference Can you explain to me the difference between returning value, reference to value, and const reference to value? Value: Vector2D operator += (const Vector2D& vector) { this->x += vector... stackoverflow.com 레퍼런스를 반환하는 것, const 레퍼런스를 반환하면 무슨 일이 일어나는지 알아보자. 추가로 레퍼런스를 알아보는 김에 레퍼런스에 의해 임시 개체의 수명이 변화할 수 있다는 것도 알아.. 2024. 2. 5.
[C/C++] 메모리 초기화하기: ZeroMemory 매크로 윈도우 프로그래밍에서 맨날 메모리를 0으로 초기화할 때 memset은 안 쓰고 ZeroMemory를 쓴다. ZeroMemory ZeroMemory는 매크로의 일종으로 정의는 다음과 같다. // minwinbase.h #define MoveMemory RtlMoveMemory #define CopyMemory RtlCopyMemory #define FillMemory RtlFillMemory #define ZeroMemory RtlZeroMemory // winnt.h #define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length))) #define RtlMoveMemory(Destination,Source,.. 2023. 8. 6.
[C/C++] 함수 호출 규약 __stdcall과 __cdecl에 관하여 함수 호출 규약? 함수 호출 규약을 공부하게 된 계기 함수의 선언형은 반환형 + 함수명 + 매개변수 리스트 로 구성된다. 함수의 반환형은 단 하나이다. 그래서 int, double과 같은 기본형과 MyClass 같은 사용자 정의형이 반환형에 들어간다. 그런데 아래 함수들을 보니 반환형과 함수 이름 사이에 뭔가 인자가 하나 더 있다. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow); LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam); WINAPI, CALLBACK .. 2023. 8. 3.
[C++] 스마트 포인터 - unique_ptr과 안전하게 쓰는 방법 *해당 글은 POCU 아카데미의 수업 ‘COMP3200: C++ 언매니지드 프로그래밍’을 듣고 개인적으로 정리한 내용입니다. 틀린 점이 있다면 지적해주시면 감사하겠습니다! 스마트 포인터? C언어에서 포인터는 사용자가 직접 메모리 할당을 제어할 수 있게 해주었지만, 잘못된 사용으로 인해 여러 가지 위험한 상황이 발생하기 쉬웠다. 할당된 메모리를 까먹고 해제하지 않거나 세그먼트 폴트 등의 오류를 만드는 게 대표적인 예다. 이 때문에 자바, C# 같은 언어에서는 아예 포인터를 없애고 가비지 컬렉터(GC; Garbage collector)를 도입했다. 그러나 메모리를 직접 제어하지 않는 만큼 성능상 손해를 보기 쉬웠다. C++은 반대로 포인터를 편하게 사용할 수 있게 개선했다. 그 시도 중 하나가 auto 포인.. 2023. 7. 20.
[C++] 왜 string은 반환이 될까? 객체는 반환할 때 복사된다(+구조체) 발단 C++을 통해 알고리즘 문제를 풀다가, 함수에서 std::string을 반환해도 되는지 의문이 생겼다. 지역 변수(local variable)로 선언된 변수는 함수를 빠져나오는 순간 사라진다. 그래서 함수에서 string과 같은 클래스를 반환하면 함수 밖에서는 이를 사용하지 못할 거라 생각했다. 그래서 기존에는 클래스, 하물며 구조체를 반환할 때에도 무조건 포인터를 전달해주었다. #include void toString(string* dst) { dst = new string("abc"); } 나쁜 방법은 아니지만 함수 밖에서 포인터를 반드시 해제해주어야 한다는 점이 문제였다. 만약 delete로 힙 영역의 객체를 지우는 걸 깜빡한다면 메모리 누수까지 발생할 수 있었다. 그러나 헤더 파일의 to_s.. 2022. 1. 20.
C언어에서의 16진수, signed int와 unsigned int 문제 발생 만약 int형 변수의 32비트에서 상위 4비트만 떼어내려고 하면 어떻게 해야 할까? 이건 오른쪽으로 28비트만큼 쉬프트 하면 얻을 수 있다. int bit; result = bit >> 28; 그러나 여기서, 만약 bit가 음수라면 어떨까? C언어는 부호가 있는 정수형 연산에서, 왼쪽 쉬프트()는 산술 쉬프트로 계산한다. 여기서 논리 쉬프트는 무조건 빈자리를 0으로 채운다는 뜻이고, 1101 > 1 = 0010 1101 >> 1 = 1110 그렇다면 음수를 오른쪽으로 28비트 쉬프트하게 되면(bit >> 28), 상위 비트는 모두 1로 채워지게 된다고 예상할 수 있다. 이를 해결하려면 쉬프트와 동시에 *마스크를 씌워줘서 상위 비트를 지울 수 있다. (* 마스킹(Masking): 숫자에 비트곱 .. 2021. 5. 3.