본문 바로가기

C

c++ preprocessor 공부기록 ifdef, replace

https://www.youtube.com/watch?v=GUgX9eV_Bu0&list=PLDV-cCQnUlIY4TMoRsrW0oqjCLTSm1nAf&index=4 

 

참조하였음

 

ABCD가 정의되어있으므로

ifdef ABCD가 참이므로

std::cout << "1: yes\n";

 

밑에서 #elif ABCD==2 => 2==2가 되므로

std::cout << "2: yes\n";이 됨

 

전체적으로 위 두개만 남게 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define ABCD 2
#include <iostream>
 
int main()
{
#ifdef ABCD
    std::cout << "1: yes\n";
#else
    std::cout << "1: no\n";
#endif
 
#ifndef ABCD
    std::cout << "2: nol\n";
#elif ABCD == 2
    std::cout << "2: yes\n";
#else
    std::cout << "2: no2\n";
#endif
}

 

Replace

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#define MAX_UNIT16 65535
#define MAX(a,b) (((a)>(b))?(a):(b))
#include <iostream>
 
int main()
{
 
    std::cout << MAX_UNIT16 << std::endl;
    std::cout << MAX(10,100<< std::endl;
    // std::cout << 65536 << std::endl;
    // (((10)>(100))?(10):(100)) 과 동일
 
}

 

중복 헤더 파일 load 방지

#ifndef CAT_H

#define CAT_H

.

.

.

#endif

 

깔끔하게 #pragma once를 사용한다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define MAX_UNIT16 65535
#define MAX(a,b) (((a)>(b))?(a):(b))
#include <iostream> // standard library
#include <limits> // user specific header
constexpr int ABCD = 2;
int main()
{
 
    std::cout << MAX_UNIT16 << std::endl;
    std::cout << MAX(10,100<< std::endl;
    // std::cout << 65536 << std::endl;
    // (((10)>(100))?(10):(100)) 과 동일
    // 그러나 replace는 좋지 않다.
    // standard library 함수를 쓰자
    // constexpr 을 사용하자
    std::cout << std::numeric_limits<uint16_t>::max() << std::endl;
    std::cout << std::max(10100<< std::endl;
 
    std::cout << __FILE__ << std::endl// 현재 cpp 파일 이름
    std::cout << __LINE__ << std::endl// 코드에서 몇번째 줄인지
    std::cout << __DATE__ << std::endl// 현재 날짜(컴파일 기준)
    std::cout << __TIME__ << std::endl// 현재 시간(컴파일 기준)
 
}

 

header file은 컨트롤 + c ,컨트롤 v의 영역임(붙여넣기 기능)

header file에 상응하는 cpp 파일은 header file을 불러 온다.(붙여넣기 기능)

하지만 header file에 없는 별도의 함수를 추가할 수 있으며 이는 main 함수와 링킹 과정에서 합쳐진다.