C , C++, C#

[C/C++] #define 매크로, #undef, size_t

vhxpffltm 2019. 12. 3. 23:00

코드 분석을 하면서 모르는 내용들에 대해 정리하고자 한다.

 

#define 매크로문에 대해 알아보자.

 

이건 대부분 매크로 상수 라고 해서 변수가 아니지만 어떤 상수값을 정의하여 사용할 수 있다는 것 

정도까지는 알고 있을것이다. 대게

 

#define [이름] [값] 

 

모양으로 사용하고 있을 것이다. 또한, 이것이 함수처럼 인수를 가지도록

 

#define sum(a,b) (a+b) 이런 형태로 쓰인다는것을 알고있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
 
using namespace std;
 
int a,b;
 
#define sum(a,b) (a+b)
#define Max_val 1000
 
int main() {
    a = Max_val + 1;
    b = sum(a, Max_val);
    cout << a << '\n' << b << endl;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

코드와 그 결과이다 이렇게 쉽게 사용해왔다. 하지만 이것이 복잡한 함수처럼도 사용할 수 있다는 것이다.

 

여기서 #define에 대해 더 알아보자

 

#define

 

#Define 는 식별자 또는 매개 변수화 된 식별자와 토큰 문자열을 연결 하는 매크로를 만들며, 매크로가 정의된 후 컴파일러는 소스 파일에서 발생하는 각 식별자를 토큰 문자열로 대체할 수 있다.

 

인수가 있는 #define구문은 \를 이용하여 특별한 scope을 지정하여 사용할 수 있다.

아래의 코드를 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream>
 
using namespace std;
 
int a,b;
 
#define sum(a,b) (a+b)
#define Max_val 1000
 
#define GET_PLAYER_TYPE_IMPL(a)               \
   int ret = 1 + a;                               \
    float score = 0.0;                         \
    for (size_t i = 0; i < 10++i) {          \
        ret++;                                 \
   }                                          \
    if (0.0 != score) {                        \
        ret = 1000;                            \
   }                                           \
    cout << "define 함수 호출" << endl;        \
    cout << ret << endl;                       \
    return ret;                               
                                              
 
int f1(int a) {
    GET_PLAYER_TYPE_IMPL(a);
}
 
int f2(int a, int b) {
    GET_PLAYER_TYPE_IMPL(a, b);
}
 
int f3(int a, const char *b, float c) {
    GET_PLAYER_TYPE_IMPL(a, b, c);
}
 
int main() {
    a = Max_val + 1;
    b = sum(a, Max_val);
    //cout << a << '\n' << b << endl;
    //GET_PLAYER_TYPE_IMPL(10);
    f1(1);
    f2(1011);
    f3(100"123"111.1);
    #undef GET_PLAYER_TYPE_IMPL
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

전혀 새로운 #define구문이다. 이것을 실행하면 아래와 같다.

 

 

이와 같이 #define구문을 여러 파라미터가 있는 함수처럼 사용할 수 있음을 알 수 있다. \문자를 끝에 두어 scope를 지정하여 사용하며, 여러 인자가 있도록 사용할 수 있다.

 

그리고 #undef [매크로이름] 은 위에서 선언한 매크로를 제거하는 것이다. #undef 아래에서는 위에서 정의한 매크로를 사용할 수 없다. 

 

매크로 상수값은 일반 변수에 바로 대입할 수 없다는것을 알아두자. 기본이다.

 

번외로 코드에서 'size_t'에 대해 조금만 살펴보고 가자

 

size_t

일반적으로 배열 인덱싱 및 루프 카운팅에 사용된다. 이론상 가장 큰 데이터로 "unsigned 데이터 타입" 이다. 만약에 32 bits 머신에서는 32 bits로 표현 가능 한 가장 큰 정수형 을 의미한다. 단순히 unsigned int 가 아니라는 것을 알아두자. 그리고 64 bits  머신에서는 unsigned long long 의 형태를 띄게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <cstddef>
#include <iostream>
#include <array>
 
int main()
{
    std::array<std::size_t,10> a;
    for (std::size_t i = 0; i != a.size(); ++i)
        a[i] = i;
    for (std::size_t i = a.size()-1; i < a.size(); --i)
        std::cout << a[i] << " ";
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

위의 코드를 실행했을 때 어떤 결과가 뜨는지는 쉽게 알 수 있을 것이다.

 

Reference

https://docs.microsoft.com/ko-kr/cpp/preprocessor/hash-define-directive-c-cpp?view=vs-2017

https://en.cppreference.com/w/cpp/types/size_t

 

 

'C , C++, C#' 카테고리의 다른 글

[C/C++] C++ 17 문법 unpacking(언패킹), 구조체 바인딩  (0) 2019.12.09
[C/C++] #if #elif #endif 조건부 컴파일  (0) 2019.12.04
[C/C++] move  (0) 2019.11.14
[C/C++] 이동 생성자  (0) 2019.11.03
[C++] 가상함수 테이블  (0) 2019.03.12