[8주차] 전처리기와 분할 컴파일
전처리기와 분할 컴파일
전처리pre-processing
컴파일러가 소스 파일을 컴파일하기 이전 과정으로 전처리기 지시자(#
)를 사용함.
프로그램이 전처리 되는 과정은 소스파일(*.c
)과 헤더 파일(*.h
)을 사용하여 전처리한 소스 파일을 컴파일하여 오브젝트 파일(*.obj
)로 만들고, 링커를 통해 라이브러리와 합쳐 실행 파일(*.exe
)로 만듦.
전처리 지시자
프로그램의 선두에 위치하며, #
으로 시작하고 문장 끝에 세미콜론을 사용하지 않음
전처리 지시자 | 기능 |
---|---|
#include | 프로그램 외부의 파일을 불러옴 |
#define | 매크로 상수/함수를 정의 |
#undef | 정의한 매크로 취소 |
#if ~ (#elif ~ #else ~) #endif | 조건부 컴파일 |
#include
지정된 특정 파일의 내용을 해당 지시자가 있는 위치에 삽입
<>
: 컴파일러가 제공하는 헤더 파일을 포함""
: 프로그래머가 직접 만든 파일을 포함하며, 경로를 \만으로 표현
#define
매크로 함수 및 상수 정의에 사용, 특정 상수를 프로그래머가 정의한 문자열로 대체
#undef
정의된 매크로를 해제. 해제한 매크로는 새로 재정의 가능
조건부 컴파일
전처리문에서 주어진 조건의 만족 여부에 따라 코드를 선택적으로 컴파일.
전처리 지시자 | 기능 |
---|---|
#if ~ #endif | 조건이 참이면 컴파일에 포함 |
#ifdef ~ #endif | 매크로가 정의되어 있으면 컴파일 |
#ifndef ~ #endif | 매크로가 정의되어 있지 않으면 컴파일 |
#if OS == 1
printf("Linux");
#elif OS == 2
printf("Windows");
#else
printf("else");
#endif
단, 조건식에서 실수 상수, 문자열 상수, 변수 등을 사용할 수 없음.
분할 컴파일
하나의 프로젝트를 모듈 별로 여러 소스 파일에 나누어 작성한 후, 소스 파일 별로 컴파일 하는 것.
각 파일을 따로 작성, 컴파일 한 후, 링커를 통해 하나의 실행 파일을 생성하여 실행함.
각 함수별로 파일을 분리하여 만든 후, main이 있는 소스 코드에 각 소스 코드의 파일명과 일치하는 함수 원형을 정의해주면 됨.
주의사항
각 소스 파일은 독립적으로, 오류 없이 컴파일 되어야 함.
다른 파일에서 선언된 변수나 함수를 사용하고 싶다면 컴파일러에게 어떤 변수와 함수가 외부 파일에서 선언 및 정의된 함수인지를 extern
선언을 통해 알려줘야 함.
extern 키워드
해당 변수 혹은 함수가 외부에 선언 및 정의되어 있다는 사실을 컴파일러에게 전달.
extern 키워드가 붙은 변수를 외부 변수라고 함. 함수의 경우 extern을 생략 가능.
static 키워드
정적 변수로 선언하되 외부 파일에서의 접근을 제한하려면 static 키워드를 변수나 함수 앞에 붙이면 됨.
헤더파일(*.h)
여러 소스 파일에서 사용하는 외부 변수나 함수 등을 모아놓은 파일로, 필요할 때 헤더파일만 include하여 사용 가능함.
상수, 자료형 정의, 함수 원형 선언, 외부 변수선언, typedef 정의, 매크로 명령문 등을 포함.
헤더파일을 중복으로 삽입하지 않도록 주의할 것
header1을 header2와 main이 include하는데, main에서 header1과 header2를 모두 include 하는 경우.
변수의 사용범위와 라이프 사이클
변수는 크게 변수의 사용범위와 지속시간으로 구분함.
사용범위
- 전역 변수
- 프로그램 전역에서 사용
- extern을 사용하면 다른 파일에서도 사용
- 프로그램 시작 시 할당된 메모리 공간이 종료 시까지 유지
- 지역 변수
- 선언된 함수/블록 내부에서만 사용
- 프로그램 수행 도중, 함수나 블록이 시작 시 할당되고 해당 블록이 끝나면 해제
- 정적 변수
- static 키워드로 선언
- 둘 다 전역 변수처럼 프로그램 실행 기간 전체 동안 지속
- 변수의 사용 범위는 전역 변수이냐 지역 변수이냐에 따라 다름
'학부 수업 > C프로그래밍' 카테고리의 다른 글
[7주차] 파일 입출력 (0) | 2020.04.10 |
---|---|
[6주차] 연산자 함수, 자료형 심화 (0) | 2020.04.10 |
[5주차] 동적 할당 (0) | 2020.04.10 |
[4주차] 구조체 (0) | 2020.04.10 |
[3주차] 문자열 (0) | 2020.04.10 |
댓글
이 글 공유하기
다른 글
-
[7주차] 파일 입출력
[7주차] 파일 입출력
2020.04.10 -
[6주차] 연산자 함수, 자료형 심화
[6주차] 연산자 함수, 자료형 심화
2020.04.10 -
[5주차] 동적 할당
[5주차] 동적 할당
2020.04.10 -
[4주차] 구조체
[4주차] 구조체
2020.04.10