About C – “전처리기 , preprocessor”
About C – “전처리기 , preprocessor”
10월 1, 2021
전처리기란?
전처리기는 컴파일 전, 프로그램에 대한 일련의 작업을 수행하는 것입니다. 예전에 말씀드렸듯이 C언어는 main함수와 기타 다른 함수들의 집합인데, #로 시작하는 이것은 처음에 보기엔 이상해 보입니다. 전처리기는 보통 main함수 외부에 작성됩니다.이는 기계어 코드를 생성하지 않고, 소스 코드를 컴파일하기 좋게 가공합니다. 예를 들면, 앞으로 배우겠지만 함수의 선언과 같은 작업을 할 때입니다. 함수의 선언을 한 헤더 파일을 전처리기로 추가시켜 놓고, 정의는 main함수 이후에 하는 방식으로 프로그램을 작성할 수도 있습니다. 전처리기는 #를 명령어 앞에 붙이고, ; 기호를 사용하지 않습니다.
define문
- 매크로, 함수같은 매크로를 만들 때 사용합니다.
- 매크로는 #define 매크로명 상수or문자열 으로 사용합니다.
#include <stdio.h>
#define MYAGE 21 // MYAGE는 아래의 코드에서 21을 뜻합니다.
int main(){
printf("나의 나이는 %d 입니다.",MYAGE);
return 0;
}
//나의 나이는 21 입니다.
//매크로(define전처리기)로 MYAGE 는 21이라는 것을 알려줍니다.
//define전처리기가 없다면 선언되지 않은 식별자의 사용이라는 오류가 발생
- 함수같은 매크로를 만들 때는 어떨까요?
#include <stdio.h>
#define SQRE(i) ((i)*(i)) //SQRE(i)를, i*i 로 바꾸어 줍니다.
int main()
{
printf("SQRE(5) = %d", SQRE(5));
}
//SQRE5 = 25
include문
- 파일을 프로그램에 포함시키고자 할 때 사용합니다.
- <>는 표준 헤더 파일을 표준 헤더 디렉토리에서 찾아 포함시키는 경우에 사용합니다.
- 표준 헤더 파일이 아닌, 프로그래머가 만든 파일을 포함싴니고 싶으면 <>대신, “”를 사용합니다.
- 표준 헤더 파일 또한 “”를 사용하여 포함시킬 수가 있습니다.
조건부 컴파일, #if ~ #endif
- * 해당 부분을 컴파일할 것인지, 하지 않을 것일지를 판단하는 전처리기입니다.
- 조건이 참인지를 검사하고, #if와 #endif 사이의 모든 소스코드를 컴파일합니다.
#if 조건1 문장1 // 조건 1이 참이면, 문장 1을 컴파일합니다.
#elif 조건2 문장2 // 조건 1이 거짓이면, 조건 2를 검사하고 참이면 문장 2를 컴파일합니다.
#else 문장3//조건 2가 거짓이면 문장 3을 컴파일합니다.
#endif
와 같이 사용합니다.
조건부 컴파일, #ifdef ~ #endif
해당 매크로가 미리 정의되어 있으면, 나열된 문장을 컴파일하라는 것입니다.
#ifdef 매크로명 // 만약 해당 매크로명의 매크로가 정의되어 있다면, 문장을 컴파일
문장
#endif
ifdef~#endif는 다음과 같이 만들 수도 있습니다.
#ifdef 매크로명
매크로가 정의되었을 경우, 컴파일할 부분.
#else
정의되지 않았을 경우 컴파일할 부분
#endif
조건부 컴파일, #ifndef ~ #endif
- 해당 매크로가 미리 정의되어 있지 않을 때, 나열된 문장을 컴파일하라는 것입니다.
- ifndef는 if not defined 라는 의미입니다.
#ifndef 매크로명
문장
#endif
와 같이 사용합니다.
기타 전처리기
- #undef : #define에 의해 이미 정의된 매크로를 취소합니다. 가장 마지막에 정의된 매크로의 정의가 취소됩니다.
- #error : 컴파일하는 동안 에러가 발생하면, 컴파일 작업을 중단하고 #error 명령의 행번호와 파일 이름을 포함하는 시스템 정보와 함께 에러 메세지를 출력합니다.
- #line : 컴파일할 때 행번호와 파일 이름을 변경할 수 있도록 합니다.ex) #line 숫자 “파일명” 처럼 사용할 수있습니다.
- #는 매크로 함수의 매개변수를 문자열로 만듭니다.
#include <stdio.h>
#define EX(aa) # aa // EX라는 매크로 함수의 매개변수가 aa면, aa를 문자열로 만듭니다.
int main()
{
printf("%s",EX(YEAH BUDDY!)); // EX(YEAH BUDDY!) 가 문자열로 만들어져서 %s로 출력되는 것을 확인할 수 있습니다.
}
##은 두 개의 토큰을 결합시킵니다.
#include <stdio.h>
#define SQRE(a) (a##a) * (a##a) // 만약 a가 2라면, 11*11
int main()
{
printf("%d", SQRE(5)); // a가 5이므로 55*55
}
와 같이 사용할 수 있습니다. 간략한 C언어 전처리기 정리입니다.