프로그래밍 언어/C++

    C 조건부 전처리기

    1. #if #elif #else #endif 기존에 알고있는 조건문인 if else 와 동일한 내용이다 하지만 전처리기라는 부분에서 if else와 차이점은 매크로로 정의된 값에 따라 원하는 코드를 동작할 수도 있고 동작시키지 않을수도 있는 것이다. #include #define NUM 10 int main() { #if NUM == 10 printf("매크로로 정의된 NUM의 값은 10\n"); #elif NUM == 20 printf("매크로로 정의된 NUM의 값은 20\n"); #else printf("매크로로 정의된 NUM의 값은 10도 20도 아님\n"); #endif return 0; } #if 0, #if 1 평가값이 0 이면 다음줄 부터의 내용을 건너뛰고, 평가값이 0이 아니면 처리한다...

    C++ 클래스 템플릿에 선언된 friend 함수를 외부에 정의하는 방법

    적용 시 오류 template class Stack { ... public: friend std::ostream& operator

    C/C++ 예외상황에서의 포인터의 동작

    포인터의 사용법의 구문과 의미는 C 표준 문서(http://bit.ly/173cDxJ)에 매우 자세히 설명되어 있다. 그러나 표준 문서가 포인터의 동작을 명확히 정의하지 못하는 경우가 있다. 이러 떄 표준 문서는 포인터의 동작을 다음과 같이 정의한다. - 구현 방법에 따라 정의된 행동(Implementation-defined behavior) 동작에 대한 문서화된 구현을 제공한다. 구현 방법에 따라 정의된 행동의 예로, 정수에 대한 오른쪽 시피트 연산에서 상위 비트의 확장 방법이 있다. - 명시되지 않은 행동(Unspecified behavior) 동작에 대한 구현을 제공하지만 문서화하지 않는다. malloc함수에 인자로 0을 주고, 실핼할 때 메모리가 얼마나 할당되는가 하는 것이 명시되지 않은 행동의 ..

    C++ if/switch statement with initializer

    0. 서문 지금까지의 C++에서 if 또는 switch의 평가식에 사용되는 변수는 미리 선언되고 적절히 초기화된 상태여야 한다. std::map에 원소를 추가하고 이에 대한 예외 처리를 하는 아래 예제가 일반적인 샘플이라 할 수 있다. #include #include int main() { std::map map; map["hello"] = 1; map["world"] = 2; // 일단 insert를 수행하고 결과 pair를 반환받아야 한다. auto ret = map.insert({ "hello", 3 }); // 그러고 나서, pair의 2번째 요소를 체크 if (!ret.second) std::cout

    C++ 모듈 (Module)

    정의 기존의 #include 방식인 Translation Unit 방식과는 다른, 별개와 컴파일되는 소스 코드 파일의 집합이다. Header파일을 사용하면서 생겨나는 많은 문제를 제거하거나 줄이고, 컴파일 시간을 단축하기도 한다. 선언된 모든 매크로, 전처리 지시문과 export 하지 않는 이름(names)들은 표시되지 않으며, 컴파일 할 때 영향을 주지 않는다. 또한 순서에 관계 없이 가져올 수 있다. (include, import) Module을 한 번 컴파일한 후에는 export된 모든 형식(Type), 함수 및 템플릿을 이진파일에 저장한다. 이 파일은 이전의 헤더 파일들보다 훨씬 빠르게 처리될 수 있다. 기존의 C++ 빌드 과정 C++ 프로그램의 빌드 과정은 전처리, 컴파일, 링크로 구성된다. 전..

    C언어로 객체지향 주 4개의 요소 (추상화,다형성,상속,캡슐화) 구현하기

    추상화 (클래스) 비슷하게 생긴 Cpp과 C를 비교해보자. Cpp는 class를 이용해서 class에서 사용할 상태와 메서드들을 선언할 수 있다. 반면 C의 struct에서는 오직 상태만을 저장할 수 있다. 일반적으로 C에서 struct에 관한 함수들을 작성한다면, 이름으로 특정 구조체와 관련된 함수임을 나타낸다. 예를 들어 x, y, width, height를 변수로 가지는 Rect라는 구조체가 있다면, 아래와 같이 파일을 작성하는 것이 일반적이다. /* rect.h */ struct Rect { unsigned int x; unsigned int y; unsigned int width; unsigned int height; }; void rect_move(struct Rect *rect, unsign..

    C++ call by value, call by reference

    1. 예시 코드 주요 설명 명칭 설명 vector vec main 함수에서 선언한 int형 vector void modifyVector(vector vec) call by value 방식으로 vec의 원소 값을 받는 함수 void modifyVector(vector &vec) call by reference 방식으로 vec의 주소 값을 받는 함수 vec.size() vec의 크기를 반환하는 멤버변수 unsigned int형으로 반환 vec.at(정수형 인덱스) vec에 정수형 인덱스에 해당되는 원소 값을 반환 vec.push_back(정수) vec의 마지막 원소 뒤에 정수 값을 추가 2. call by value #include #include using namespace std; void modifyV..

    C++ (template, auto, decltype) 타입 추론 Universal reference

    1. 정의 C++11의 새로운 피쳐들 중에서 아마 가장 의미있는 것은 RValue reference일 것이다. 이로 인해 move semantics와 perferect forwarding이 가능해졌기 때문이다. 문법적으로 &&(ampersands) 2개를 붙여 표시한다. void f(widget&& param); 위 예제를 보면 rvalue reference를 &&로 표기하는데 아무런 문제가 없어보인다. 하지만, 다음의 예제들은 &&로 rvalue reference를 의미할수도 그렇지 않을 수도 있다. Widget&& var1 = someWidget; // rvalue ref auto&& var2 = var1; // rvalue ref or lvalue ref (universal ref) template..

    C++ 공용체(union) 개념과 통신에서의 사용 이유

    union 정의 union은 struct와 유사하지만 union의 변수 중 가장 큰 변수의 메모리를 모든 변수가 공유한다는 점에서 다르다. 같은 변수를 가지는 struct와 union의 size를 출력해보면 아래와 같이 결과가 다른것을 확인할 수 있다. typedef struct sizeTest_struct { int a;// 4byte double b;// 8byte }sizeTest_struct; typedef union sizeTest_union { int a; double b; }sizeTest_union; int main() { sizeTest_struct s; sizeTest_union u; printf("struct size : %d\r\n", sizeof(s));// 16 printf("u..

    C++ struct(구조체), union(공용체) 크기에 대한 정리

    1. struct Struct(구조체)는 구조체 멤버중 가장 큰 변수의 크기를값을 기준으로 잡고 기준값의 크기에 나머지 변수를 순서대로 차곡 차곡 배치하여 구조체의 전체 크기가 결정 된다. 아래의 예시 코드를 보자. typedef struct test{ int a; long c; char b; char d:1, //d:1의 의미는 char d를 1bit 의 크기로 계산하고 사용한다는 의미 e:1, f:1, g:2, i:1, k:1; long h; } test; int main(void) { test k; k.g=1; // printf("a:%d \n",k.g); printf("size : %d\n",sizeof(k)); return 0; } 구조체 형태 도식화 (long 은 64bit 운영체제에서 8by..