반응형

C언어는 일반적으로 기게어로 바뀔때 5가지 과정을 통해서 변환된다. 

우리는 그중 컴파일(어셈블러로 변환) 보다 전에있는 전처리 과정에 처리되는 전처리기에 대해서 알아보고자 한다.

전처리기는 전처리 과정에서 코드에서 삭제되고, 대신 그 기능을 실행한다.

모든 전처리기는 #으로 시작한다.

전처리기를 잘 사용하면 시간을 줄이거나, 코드를 깔끔하게 만드는등 장점이 많다. 

1. #include

일반적으로 #include<stdio.h>로 프로그램 처음 배웠을때 부터 보았을 친구이다.

#include <stdio.h>
//C언어 표준헤더일때 주로 사용하는 방식
#include "abc.h"
//c언어 표준헤더가 아니고, 사용자가 추가한 파일을 헤더로 하는 방식

크게 두가지 방식으로, <>은 표준헤더일때, ""는 사용자 파일 헤더일때 사용한다고 생각하면 된다.

이 # include의 의미는, 그 소스코드 전체를 저기다 갔다 넣는 것을 의미한다. (위 코드는 stdio.h file 코드 전체, abc.h file 코드 전체가 올라간다고 생각하면 된다.)

이때 헤더파일에는 특정 함수의 선언만 되어있고, 그 정의는 이름이 같은 C file에 구현되어있다. (이 두개를 연결시키는 것은 빌드작업을 통해 IDE가 알아서 잘 해주니 신경쓰지 말것)

같은 헤더파일이 두개가 들어갈경우, 문제가 생겨야 하지만, .h 파일에 #ifdef를 이용한 중복방지를 해놓았으므로 중복을 피할 수 있다.

2. #define

#define ABC //매크로 정의
#define ABC 1 //매크로 상수 정의
#define MAX(a, b) ((a) > (b) ? (a) : (b)) //매크로 함수 정의

3가지가 조금씩 다른데

a. 매크로 정의는 그냥 이 값이 정의되었다만 알리고 싶을때 사용한다. 나중에 #if 등에 유용하게 쓰인다.

b. 매크로 상수 정의 이 ABC는 1이다 라고 알려주는 용도이다. 모든 ABC를 1로 바꾼다.

c. 매크로 함수 정의 이 함수를 이렇게 정의한다고 말하는 것이다. 모든 MAX(a,b)를 삼항연산자 꼴로 바꾼다.

 

이 define 된것을 지우고 싶을때는 #undef를 사용한다.

#def ABC
#undef ABC

a. undef를 사용할때는 ABC가 있어야하므로, ifdef와 웬만해선 같이쓴다.

b. def와 undef사이에는 def가 존재하는 개념이다. 

 

3. #if, #ifdef, #ifndef

a. #if~#elif~#else~#endif

다들 생각하는 그 방법이다. 단, 일반적인 C언어와 약간 문법적으로 다르다.

#if _STR_
//사이내용은 자유롭게 들어감
#elif _ABC_
//마찬가지
#else 
//마찬가지
#endif
//이 뒤로는 저 if문의 범위가 아님

이런식으로 구현된다.

b. #ifdef~#else~#endif #ifdef는 그것이 선언되어있는가에 대한 내용으로, .h 파일의 중복방지가 대표적이다.

c. #ifndef~#else~#endif b와 정반대를 의미한다. 

반응형

+ Recent posts