[C++]9. C++ #if #define 사용하기
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 C++에서 많이 쓰이는 #if에 대해서 알아 보도록 하겠습니다.
프로그래밍을 하다보면 if문이 있죠 이런 if문 등을 이용해서 특정한 부분을 빌드를 못하게 막거나
테스트 코드를 만든다거나 할때 쓰이는 것이 전처리 지시문 입니다.
그런데 이러한 #if문이다 #define문등을 왜 사용하는지 이유를 모를때가 많습니다.
현업에서 C++로 프로그래밍을 하면 아 이것은 당연히 사용하는거 아닌가 하지만
초보 프로그래머나 학교에서 작은 프로젝트를 하는사람들은 이게 왜?? 필요한것인지 의문이 들때가 많습니다.
그래서 코드를 가지고 설명을 드리겠습니다.
pro파일
1
2
3
4
5
6
7
8
9
10
11
12
13
|
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
DEFINES += WINDOW #window가 정의
SOURCES += main.cpp \
ServiceClass.cpp
HEADERS += \
ServiceClass.h
|
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include "ServiceClass.h"
ServiceClass::ServiceClass()
{
listTest();
}
ServiceClass::~ServiceClass()
{
}
void ServiceClass::listTest()
{
int count = 0;
#if defined(WINDOW)//window가 정의되어 있다면 #else전까지 빌드
mList.push_back(3);//리스트 뒤에 원소를 추가하는 함수
mList.push_back(4);
mList.push_back(5);
mList.push_back(6);
mList.push_back(7);
std::cout << "============push_back===========" << std::endl;
for(auto list : mList){
std::cout << "mList index :" << count << "mList value:" << list << std::endl;
count++;
}
count = 0;
mList.push_front(2);//리스트 앞에 원소를 추가하는 함수
mList.push_front(1);
std::cout << "============push_front===========" << std::endl;
for(auto list : mList){//리스트의 모든 원소를 출력
std::cout << "mList index :" << count << "mList value:" << list << std::endl;
count++;
}
#else//window가 정의되어 있지 않다면 #else이후 빌드
count = 0;
mList.pop_back();//리스트 맨뒤에 원소를 삭제 하는 함수
mList.pop_back();
std::cout << "============pop_back===========" << std::endl;
for(auto list : mList){
std::cout << "mList index :" << count << "mList value:" << list << std::endl;
count++;
}
count = 0;
mList.pop_front();//리스트의 맨 앞의 원소를 삭제 하는 함수
mList.pop_front();
std::cout << "============pop_front===========" << std::endl;
for(auto list : mList){
std::cout << "mList index :" << count << "mList value:" << list << std::endl;
count++;
}
#endif
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
위의 코드를 보겠습니다.
프로젝트 파일에서 window라는 것을 선언을 해주었고 코드상에서 #if define으로 window가 선언되어있으면 위의 코드를
아니면 #else이후의 코드를 빌드하게 위의 실행이미지 처럼 나오게 됩니다.
만약 어떠한 프로그램이 윈도우에서도 돌아가야하고 리눅스에서도 돌아가야하는 프로그램이라면
윈도우에서만 지원하는 라이브러리가 있을것이고 리눅스에서만 지원하는 라이브러리가 있을겁니다.
그런데 하나의 파일로 윈도우와 리눅스 두가지를 모두 빌드하기위해서는 위와같이 window일땐 이렇게 빌드하고
리눅스일때는 저렇게 빌드하는식으로 해줄수가 있습니다.
그래서 #define같은 경우에는 아주 유용하게 쓰입니다.
예를들어 제가 일하는 업무처럼 보드에서 사용하는 api랑 리눅스pc에서 사용하는 api가 다를때가 있습니다.
이럴때 #define로 pc일때는 pc에서 사용하는 api 보드에서는 보드에서만 사용하는 api만 사용할수 있도록
위와같이 코딩을 해줄수 있습니다.
그리고 또한가지 #if를 사용해서 테스트 코드를 만들때도 많이 사용하는데요
#if를 사용해서 테스트 코드를 사용하는 것을 아래 코드로 설명 드리겠습니다.
위의 이미지와 같이 #if를 이용해서 테스트 코드이면 #else 를타서 테스트 코드를 실행시키고
테스트 코드가 아니면 #if 에서 #else까지의 코드를 타서 테스트코드가 아닌 코드를 실행 시킬수 있습니다.
즉 0과 1만 바꿔주면 빌드를 해주고 안해주고를 할수 있기때문에 테스트 코드를 실행시킬때
#else이후에 테스트 코드를 넣고 이전에는 정상코드를 넣어주면 손쉽게 테스크 코드를 실행시킬수가 있습니다.
이러한 내용은 임베디드 같이 보드에서 테스트를 해야하는 환경이 잘안될때 pc에서 테스트할때 많이 사용하는 방법으로
알아두시면 개발하는데 아주 도움이 많이됩니다.
개발자는 항상 자기가 짠 코드를 테스트를 많이 해보아야하기 때문이죠
여기 까지 #if및 #define에 대해서 포스팅 하였습니다.
오늘은 조금 간단한 내용이었지만 앞으로 개발할때는 아주 많이 사용하는 것이므로 잘 인지하고 가져가 주셨으면
좋겠습니다.
여기까지 읽어주셔서 감사합니다.!!
'C++ > C++심화' 카테고리의 다른 글
[C++]11. 프로세스와 스레드(멀티 프로세싱? 멀티 스레드?) (0) | 2019.09.29 |
---|---|
[C++]10. vector 사용하기(구조체 vector중간 원소 삭제하기,특정원소 삭제하기) (0) | 2019.09.04 |
[C++]8. C++ list사용하기 (0) | 2019.08.24 |
[C++]7. vector 사용하기(vector에서 중간 원소 삭제하기) (0) | 2019.08.17 |
[C++]6. vector 사용하기(구조체 vector사용 하기) (0) | 2019.07.14 |