[C++]C++선행처리자,매크로,지시자 공부하기
본문 바로가기

C#

[C++]C++선행처리자,매크로,지시자 공부하기

728x90
반응형

오늘은 C++ 선행처리자,매크로,지시자에 대해 공부했습니다.

 

책은 C++하이킹책을 보고 공부했습니다.

 

선행처리자는 컴파일러에서 컴파일을 하기 앞서 소스파일에 대한 처리를 가장 먼저 하는 선행처리입니다.

선행처리를 위한 명령어에는 #define,#undef,#include,#if,#ifdef,#elif,#else,#endif,#line 등 있는데 명령어의 맨 앞에 #기호가 붙는다는 공통점이있다.

일반적으로 함수외부에 기술하며, 다른 소스 파일과는 독립적으로 수행된다.

 

선행처리기는 컴파일러를 돌릴 때 마다 가장 먼저 수행된다.

 

매크로상수

->#define 매크로상수 치환할 문자열 또는 상수

EX) #define TRUE 1

사용하는 이유는 상수가 여러부분 사용된다면 나중에 상숫값을 일일이 바꾸어야하는데 이걸 한 번에 바꾸기위해 매크로상수를 이용

매크로스 상수를 정의하면 프로그램의 명확성도 증대된다.

주의할 점은 매크로를 선언할 때 문장 끝에 세미콜론 ; 을 붙이지말아야한다.

 

매크로상수를 이용해서 원의 면적구하기

#include<iostream>
#define PI 3.141592
using namespace std;

void main(){
int r = 5;
double area;
area = r * r * PI;
cout << "area=" << area<<endl;
}

 

const 상수를 이용하면 #define보다 더 쉽게 상수를 만들어 사용할 수 있다.

 

const 자료형 변수명 =초깃값;

 

초기화와 함께 변수 선언을 하고 자료형앞에 const키워드를 덧붙여서 상수를 정의 할 수 있다.

const 다음의 변수명은 변수로서의 역할을 못하고 상수로 사용된다는 점을 명시해야한다.

 

EX) const 자료형 변수명 = 초깃값;

const를 덧붙인다는 것은 반드시 초깃값을 주어야한다.

 

잘못된 예

const double PI ;  //초깃값을 주지않음

PI = 3.141592;  // const가 없으면 초깃값을 주면안됨

 

매크로함수

#define 매크로함수(매개변수 리스트)  치환될 문자열 상수

 

매크로 함수가 프로그램에서 사용되면 그 위치에 매크로 정의 시 지정한 치환할 문자열이나 상수로 대치된다.

매크로 함수의 개념은 소스부분을 확장하는 개념이므로 매크로함수를 사용하면 프로그램의 처리 속도를 개선할 수 있기 때문이다.

 

제곱 승을 구하는 매크로 함수의 잘못된 예 살펴보기

#include<iostream>
using namespace std;
#define SQUARE(x) x*x
void main(void){
int a = 5, res;
res = SQUARE(a + 2);
cout << "SQUARE(a+2)=>" << res << endl;
res = 100 / SQUARE(a);
cout << "100/SQUARE(a)=>" << res << endl;
}

 

원래 결과라면 49와 4가 나와야한다.

잘못나온 이유는 우선순위때문이다.

 SQUARE(a+2)

->  res = a+2 *a+2

먼저 2*a를 계산하고 -> a+(2*a)-> 마지막에 2를 더해서 잘못나오는 것이다.

그래서 매크로함수를 정의할 때는 괄호연산자를 잘 사용해야한다.

 

제곱 승을 구하는 매크로 함수 정의하기

#include<iostream>
using namespace std;
#define SQUARE(x) ((x)*(x))
void main(void){
int a = 5, res;
res = SQUARE(a + 2);
cout << "SQUARE(a+2)=>" << res << endl;
res = 100 / SQUARE(a);
cout << "100/SQUARE(a)=>" << res << endl;
}

 

인라인함수 알아보기

인라인 함수는 매크로함수와 기능이 유사한 함수이다.

인라인 함수를 호출하면 컴파일 할 때 호출하는 부분에 인라인 함수를 대치한다.

인라인 함수를 사용하는 이유는 매크로 함수가 보장하지 못하는 안전성을 보장해준다.

 

인라인함수는 일반함수와 동일하게 선언하고 맨 앞에 inline이라는 예약어만 붙이면된다.

 

기본형식

inline 자료형 함수명 (매개변수 리스트)

{

변수 선언;

문장 ;

return(결과값);

}

 

매크로함수,인라인 함수, 일반 함수의 차이점 살펴보기

#include<iostream>
using namespace std;
#define add1(a,b) a+b;
inline int add2(int a, int b) {
return a + b;
}
int add3(int a, int b) {
return a + b;
}
void main(void){
int result;
result = 2 * add1(10, 20);
cout << "macro함수 => " << result << endl;
result = 2 * add2(10, 20);
cout << "inline함수 => " << result << endl;
result = 2 * add3(10, 20);
cout << "일반함수 => " << result << endl;

}

매크로함수는 우선순위때문에 40이나옴

 

조건부 컴파일을 위한 지시자

조건부 컴파일은 특정 조건에 따라 소스 코드 일부만을 사용할 수 있도록 하는 매크로 지시자를 말한다.

 

#if,#elif,#else,#endif 문이 조건부 컴파일을 위한 지시자이다.

 

조건부 컴파일을 위한 선행처리자 살펴보기

#include<iostream>
using namespace std;
#define MAX 20
void main() {
int size;

#if MAX>100
size = 100;
#elif MAX>10
size = 10;
#else size=0;
#endif
cout << "size=" << size << endl;

}

#ifdef문 .#ifndef문 사용하기

#include<iostream>
using namespace std;
#define _MYDEBUG 10

#ifdef _MYDEBUG
void sub() {
cout << "debug" << endl;
}
#endif
#ifndef _MYDEBUG
void sub() {
cout << "release" << endl;
}
#endif
void main() {
sub();
}

 

#ifdef문은 특정 매크로가 저으이되어 있는지를 물어본다. 

#ifndef문은 "if not define"을 줄여서 만든 문장으로 특정 매크로가 정의되어 있지 않았는지를 물어볼 때 사용한다.

 

#undef문은 #define문과는 정반대의 역활을 하는 것으로 이미 정의된 기호 상수를 취소시켜 정의되지 않는 상태로 만들고자 할 때 사용한다.

 

#undef문 사용하기

#include<iostream>
using namespace std;
#define SIZE 10

void main() {
int i, j;
i = SIZE;

#ifdef SIZE
#undef SIZE
#define SIZE 20
#endif
j = SIZE;
cout << "i = " << i << "\tj = " << j << endl;
}

 

내장 매크로 

C++에서 기본적으로 정의되어 있는 매크로들이 존재하는데 이들을 내장 매크로라고 한다.

 

종류

__DATE__ => 현재 날짜(월 , 일 , 년)으로 치환한다.

__TIME__ => 현재 시간 (시:분:초)로 치환한다.

__LINE__ => 소스 파일에서의 현재 행번호로 치환한다.

__FILE__ => 소스 파일명으로 치환한다.

 

파일 삽입을 위한 지시자

#include문은 외부파일을 현재 진행중인 파일에 덧붙여 놓는 역활을 하는 선행처리자이다.

파일명을 기술하는 2가지방법

#include<파일명>

#include"파일명"

 

만약 사용자가 헤더파일을 직접 정의해서 사용 할 경우는 #include"파일명" 사용한다.

 

이상으로 선행처리자,매크로,지시자 포스팅을 마치겠습니다.

반응형