본문 바로가기
반응형

전체 글1339

[C/C++] 정의된 매크로 (__FUNCTION__ __DATE__ 등) 정의된 매크로매크로 중에는 이미 약속되어 있는 매크로 존재컴파일러 종류와 버전에 따라 다를 수 있다. __FILE__ 전체 디렉터리 경로를 포함한 파일명 __FUNCTION__ 매크로명이 사용된 함수 이름 __LINE__ 매크로명이 사용된 행 번호 __DATE__ __TIME__ 컴파일 시작한 날짜와 시간 [예시 코드]#include void handleError(const char* errorMessage){ std::cerr 결과 예시이외의 다양한 매크로__GNUC__ (GNU 컴파일러 사용 여부 및 버전) __cplusplus (C++ 표준 버전)와 같이 다양한 매크로도 있으니 찾아보면 좋을 것 같다.#include int main(){#if __cplusplus >= 202002L st.. 2025. 4. 12.
[C] 포인터 변수 개념 포인터포인터 변수란 메모리의 주소 값을 저장하기 위한 변수#include #include int main(void) { int num = 7; int* p; // 포인터 변수 선언 p = # // num의 주소값을 포인터 변수 p에 저장 printf("%d", *p); // 포인터 p가 가리키고 있는 실제값 출력}포인터 변수 p이 int형 변수 num을 가리킨다.포인터 변수는 double *p;와 unsigned int *p; 같이 선언 포인터 형(type)은 메모리 공간을 참조하는 기준이 됩니다. - int (4 byte), double (8 byte)#include #include int main(void) { double num = 3.14; // doubl.. 2025. 3. 30.
[C/C++] 비트 필드 구조체 비트 필드 구조체 (Bit Field Struct)• 멤버 크기를 비트 단위로 설정• 메모리 절약하면서 하드웨어 레지스터 직접 관리• 여러 bool 타입 관리에 유용 ex) 플래그 설정 #include // 비트 필드 구조체 정의struct BitField { unsigned int a : 1; // 1비트 unsigned int b : 2; // 2비트 unsigned int c : 3; // 3비트};void main() { struct BitField bf = { 1, 2, 5 }; printf("a: %u\n", bf.a); printf("b: %u\n", bf.b); printf("c: %u\n", bf.c); printf("크기: %d\n", s.. 2025. 3. 23.
[C++] noexcept noexcept 키워드• 함수가 예외가 있는지 없는지 조사• 함수가 "예외 없음"을 표시 #include void f1() { }void f2(int a, int b) { throw 1; }int main(){ bool b1 = noexcept(f1()); bool b2 = noexcept(f2(1, 2)); printf("%d %d\n", b1, b2); // ?}실제 함수 실행하는 것이 아니다. 함수 구현부까지 확인하는 것이 아니다. 그렇기에 f1 에서 예외가 없더라도 컴파일러는 알 수 있는 방법이 없다.함수가 예외 없음을 알리려면 함수 선언 뒤에 noexcept 키워드를 붙인다.#include void f1() noexcept { }void f2(int a, int b) { throw 1; }int.. 2025. 3. 20.
[C++] RAII & stack unwinding 💡 stack unwinding (스택 풀기)예외 발생으로 catch 처리되는 중간과정에서 만들어진 stack 에 있는 모든 변수(객체)는 소멸되었기 때문이다.  [예제]Q) f2() 에서 throw 예외 발생할 때 f1() 온전한 수행을 할 수 있을까?#include struct Object{ ~Object() { printf("~Object 소멸자\n"); }};void f2(){ printf("f2 start\n"); throw 1; printf("f2 end\n");}void f1(){ printf("f1 start\n"); Object obj; f2(); printf("f1 end\n");}int main(){ try { f1(); } catch (...) { printf("catch..... 2025. 3. 19.
[C++] 오류 처리 방식 (Error Handling) 오류 처리 방식 (Error Handling)① 약속된 함수 반환값 ② 예외(Exception) 사용 ③ 성공/실패 결과가 모두 담을 수 있는 타입 반환 [예제]Connect 실패 시 어떻게 처리할 것인가?→ 프로세스 종료하거나 오류 처리를 해주어야 한다.int connect(){ // sth...}int main(){ connect();}[예제] 약속된 반환값#define ERROR (-1)int connect(){ bool ret = false; // Sth... if (ret == false) { return ERROR; }}int main(){ connect();}[단점] 간단한 함수라면 약속된 반환 값으로 처리할 수 있지만 해당 반환 값이 어떤 의미인지 숙지해야 한다. ex) 반환 값이 실제.. 2025. 3. 17.
[C++] 깊은 복사 (Deep Copy) 깊은 복사 (Deep Copy) 객체 복사할 때,원본 객체가 가지고 있는 데이터를 새로운 메모리 공간에 복사하여완전히 독립적인 객체를 만드는 방식 💡 깊은 복사가 필요한 경우 ✅ 클래스 내부에 포인터 멤버 변수가 존재할 때 ✅ 동적 메모리를 개별적으로 관리해야 할 때 ✅ 동일한 데이터를 공유하지 않고, 독립적인 복사본이 필요할 때 📌 [C++] 얕은 복사 (Shallow Copy) [C++] 얕은 복사 (Shallow Copy)얕은 복사 (Shallow Copy)• 메모리 자체를 복사 하지 않고 주소만 복사• 일반적으로 「=」 연산자가 해당  [예제] 복사성생자 & 대입 연산자#include class Point{ int x = 0; int y = 0;public: Point() = default; .. 2025. 3. 16.
[C++] 함수 객체 (function object) 함수 객체 (function object)「( )」 연산자를 재정의 해서 함수 처럼 사용 가능한 객체 📌 [C++] 연산자 재정의 (Operator Overloading) [C++] 연산자 재정의 (Operator Overloading)연산자 재정의 (Operator Overloading)사용자 정의 타입에서 +, - 등 연산자 사용할 수 있는 문법class Point{ int x = 0; int y = 0;public: Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1{ 1, 1 }; Pointzoosso.tistory.com [예제] 함수 객체 p.operator()(1, 2) 와 같은 형태로 사용#inc.. 2025. 3. 15.
[C++] 상속과 복사/대입 연산자 상속과 복사/대입 연산자부모-자식 상속에서 컴파일러가 알아서 만들어주는 Case가 많은데이중에서 복사 생성자 / 대입연산자 주의 사항이 있다. #include class Base{ int b;public: Base() = default; Base(int n) : b{ n } {} int Get() { return b; };};class Derived : public Base{ int d;public: Derived(int n1, int n2) : Base{ n1 }, d{ n2 } {} Derived(const Derived& other) : d(other.d) { }};int main(){ Derived d1(10, 20); Derived d2 = d1; printf("d2.b = %d\n", d2.. 2025. 3. 14.
[C++] 얕은 복사 (Shallow Copy) 얕은 복사 (Shallow Copy)• 메모리 자체를 복사 하지 않고 주소만 복사• 일반적으로 「=」 연산자가 해당  [예제] 복사성생자 & 대입 연산자#include class Point{ int x = 0; int y = 0;public: Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1{ 1, 1 }; Point p2 = p1; // 복사 생성자 p2 = p1; // 대입 연산자}Point 클래스 안에 x, y 는 각각 매핑되어 값이 복사되어 진다. • 복사 생성자 = 객체 생성하면서 초기화 • 대입 연산자 = 객체 생성 후 넣는 것  (사용자가 만들지 않으면 컴파일러가 디폴트 복사 생성자 제공) 이러한 .. 2025. 3. 13.
반응형