코드 분석을 하면서 모르는 내용들에 대해 정리하고자 한다.
#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(10, 11);
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 |