C++/Syntax 2021. 3. 9. 19:20

전처리기 (Preprocessor)

기능

  • 파일 포함시키기

    • #include

    • 특정 파일을 현재 위치에 첨부하여 하나의 파일처럼 컴파일한다.

  • 조건부 컴파일

    • #if, #elif, #else, #ifdef, #ifndef, #endif

    • 조건에 해당되는 코드만 실행한다.

    • defined 키워드와 같이 사용하여 복합적으로 정의할 수 있다.

      • OS에 따라 다른 파일을 포함시키는 예제

        #ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */
        # include <unistd.h>
        #elif defined _WIN32 /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */
        # include <windows.h>
        #endif
      • 32, 64비트에 따라 다른 동작을 하는 예제

        #if !(defined __LP64__ || defined __LLP64__) || defined _WIN32 && !defined _WIN64
          // we are compiling for a 32-bit system
        #else
          // we are compiling for a 64-bit system
        #endif
  • 매크로

    • #define, #undef

    • 컴파일 중 토큰이 나오면 바로 해당 값으로 바꾸어 컴파일한다. (단순한 문자 교환)

    • 정의한 파일 내부에서만 적용된다.

    • 대상변환형(object-like macros) : 인수 X

    • 유사함수변환형(function-like macros) : 인수 O

      • 매크로 정의

        #define <identifier> <replacement token list>                    // object-like macro
        #define <identifier>(<parameter list>) <replacement token list>  // function-like macro, note parameters
      • 매크로 삭제

        #undef <identifier>  // delete the macro
    • ## 토큰 연결 연산자

      • 두 개의 토큰을 하나로 연결

        #define DECLARE_STRUCT_TYPE(name) typedef struct name##_s name##_t
        
        DECLARE_STRUCT_TYPE(g_object); // 변환 결과는 typedef struct g_object_s g_object_t;
  • #pragma

    • 컴파일러에게 특정 옵션이나 라이브러리 형태 등을 지정할 수 있다.

참고

'C++ > Syntax' 카테고리의 다른 글

C++ 소수점 (Decimal Point)  (0) 2021.03.09
C++ 자료형 (Data Type)  (0) 2021.03.09
C++ Namespace  (0) 2021.03.09
C++ 헤더가드 (Header Guard)  (0) 2021.03.09
C++ 초기화 (Initialization)  (0) 2021.03.09
C++/Syntax 2021. 3. 9. 19:20

namespace

  • 함수, 객체 등의 이름 충돌 방지

  • namespace 내부에 또 다른 namespace를 넣을 수 있다.

'C++ > Syntax' 카테고리의 다른 글

C++ 소수점 (Decimal Point)  (0) 2021.03.09
C++ 자료형 (Data Type)  (0) 2021.03.09
C++ 전처리기 (Preprocessor)  (0) 2021.03.09
C++ 헤더가드 (Header Guard)  (0) 2021.03.09
C++ 초기화 (Initialization)  (0) 2021.03.09
C++/Syntax 2021. 3. 9. 19:19

헤더 가드 (Header Guard)

#include guard

  • internal include guard : 헤더파일 내부에서 매크로를 검사하는 것

    header.h

    #ifndef HEADER_H
    # define HEADER_H
    ...
    #endif
  • external include guard : 헤더파일을 외부에서 include할 때 매크로를 검사하는 것

    main.cpp

    #ifndef HEADER_H
    #include "header.h"
    #endif
  • 장점

    • 컴파일러에 의존하지 않는다.
  • 단점

    • 한 번 읽은 헤더 파일도 내용을 읽어야 해서 컴파일 속도가 느릴 수 있다.

      • 귀찮지만 external include guard를 적용하면 해결 가능하다.
    • 매크로 이름이 충돌할 가능성 존재한다.

      • 대규모 프로젝트에선 명명 규칙을 정해서 사용한다.

        ex) _MODULE_HEADER_H_

  • gcc에서는 이를 #pragma once와 비슷하게 처리하는 기능을 추가했다고 한다. (Include Guard Optimization)

  • 참고


#pragma once

#pragma once
  • 장점

    • 한 번 읽은 헤더 파일은 따로 기억하여 읽지 않는다. -> 빠르다.

    • MS, gcc 등에서 예전부터 지원했다.

  • 단점

    • 전처리기에서 버그가 있거나, 파일 시스템 상에서 동일성을 파악하지 못하면(소프트 링크 등) 중복으로 포함할 가능성 존재한다.

    • 컴파일러마다 지원 여부가 다르기 때문에 일단은 비표준이다.

'C++ > Syntax' 카테고리의 다른 글

C++ 소수점 (Decimal Point)  (0) 2021.03.09
C++ 자료형 (Data Type)  (0) 2021.03.09
C++ 전처리기 (Preprocessor)  (0) 2021.03.09
C++ Namespace  (0) 2021.03.09
C++ 초기화 (Initialization)  (0) 2021.03.09
C++/Syntax 2021. 3. 9. 19:18

초기화 (Initialization)

  • C에서는 솔직히 별로 의미가 없었다고 생각하는데, C++에서는 생성자의 개념 때문에 중요한 것 같다.

  • 메모리를 할당함과 동시에 값을 부여한다.


할당

  • 생성자에서 값을 대입하는 방식이다.

    int num;
    num = 42;

초기화

  • 초기화 리스트로 지정

  • Copy Initialization

    • 등호를 통해 초기화하는 방식이다.
    int width = 5;
  • Direct Initialization

    • 소괄호로 값을 감싸서 초기화하는 방식이다.
    int width(5);
  • Uniform Initialization

    • List Initialization, Brace Initialization

    • C++11

    • 위의 두 가지(Copy Initialization, Direct Initialization)보다 더 엄격하다.

      ex) int에 float을 저장하면 에러가 발생한다. (위의 두 가지는 warning이라 실행은 된다.)

      int width{ 5 };     // direct uniform initialization(preferred)
      int width = { 5 };  // copy uniform initialization
  • MS의 Visual Studio의 경우 Debug, Release 모드가 있다.

    • Release 모드의 경우 자료형에 따라 기본적인 초기화를 해준다.

    • Debug 모드에서 초기화를 하지 않으면 MS에서 정한 magic debug value가 들어간다.

      ex. 0xcccccccc : 초기화 하지 않은 스택 영역에 들어가는 값

    • Magic debug value

  • gcc의 경우 O2, O3 등의 옵션으로 최적화를 해서 릴리즈를 하는 것 같은데, 초기화까지 해주는지는 모르겠다.

'C++ > Syntax' 카테고리의 다른 글

C++ 소수점 (Decimal Point)  (0) 2021.03.09
C++ 자료형 (Data Type)  (0) 2021.03.09
C++ 전처리기 (Preprocessor)  (0) 2021.03.09
C++ Namespace  (0) 2021.03.09
C++ 헤더가드 (Header Guard)  (0) 2021.03.09
C++/TBC++ 2021. 3. 9. 19:18

언어

  • 컴파일러 언어

    • 코드를 컴파일하여 실행파일을 생성하고 실행시킨다.
  • 인터프리터 언어

    • 실행파일 없이 바로 실행시킨다.

    • 상대적으로 느리다.

      • 실행파일을 만들고 반복해서 사용하는게 더 빠르다.

주석

  • 당연한건 적지 말자

초기화 (Initialization)

헤더 가드 (Header Guard)

namespace

전처리기 (PreProcessor)


참고

'C++ > TBC++' 카테고리의 다른 글

따라하며 배우는 C++ 6장  (0) 2021.03.11
따라하며 배우는 C++ 5장  (0) 2021.03.11
따라하며 배우는 C++ 4장  (0) 2021.03.10
따라하며 배우는 C++ 3장  (0) 2021.03.10
따라하며 배우는 C++ 2장  (0) 2021.03.09

'C++'에 해당되는 글 185건