이전 글에서 실행 파일이 만들어지는 과정에 대해 알아보았다.
https://ssongkit.tistory.com/273
여러 개의 소스 파일을 작성하여 최종적으로 링크를 통해 하나의 실행 파일로 만드는 것을 분할 컴파일이라 했다.
분할 컴파일에 대해 알아보자.
분할 컴파일
코딩할 때 하나의 파일에 모든 것들을 코딩하지 않으며
기능별로 파일을 나눠서 코딩하게 되는데 이를 모듈화 프로그래밍이라고 한다.
모듈(module): 프로그램을 구성하는 구성 요소(관련된 데이터와 함수를 하나로 묶은 단위)
이렇게 작성된 모듈은 개별적으로 컴파일된 후 링커에 의해 하나의 실행 파일로 만들어진다.
이렇게 하나의 실행 파일을 만들기 위해서 소스 파일을 여러 개로 나누어 개발하는 방식을 분할 컴파일 방식이라고 한다.
extern 키워드
분할 컴파일 방식에서 여러 개의 소스 파일 사이의 상호 참조는 전역 변수와 전역 함수만이 가능하다.
기본적으로 C 컴파일러는 프로그램에 등장하는 전역 변수를 해당 파일에서만 찾는다.
따라서 외부 파일에서 참조하는 전역 변수는 컴파일러에게 외부 파일에 존재하는 변수라는 사실을 명시해야 한다.
이를 위해 파일 내에서 extern 키워드를 사용해 다시 한 번 변수를 선언해야 한다.
C 컴파일러는 extern 키워드가 붙은 전역 변수가 외부 파일에 존재하는 변수임을 인식하고 컴파일을 진행하게 된다.
extern 키워드가 붙은 전역 변수는 컴파일된 후 링크 단계에서 실제로 연결된다.
static 키워드
분할 컴파일 방식에서 변수의 접근 영역을 해당 파일로만 한정시키고자 할 때는 static 키워드를 사용하여 선언하면 된다.
이렇게 선언된 변수는 다른 소스 파일에서 extern 키워드를 사용해 선언하더라도 접근할 수 없는 전역 변수가 된다.
조건부 컴파일
조건에 따라 코드의 일정 부분을 컴파일할지 안 할지를 지정할 수 있다.
조건부 컴파일에 사용할 수 있는 조건부 컴파일 지시자(conditional compile directive)는
#if, #ifdef, #ifndef가 있다.
#if
if문과 쓰임새가 유사하다.
#if 뒤에 나오는 조건식의 결과가 0이 아니면 true, 0이면 false이다.
'#if ~ #elif ~' 또는 '#if ~ #elif ~ #else ~' 를 사용해 여러 개의 조건을 사용할 수 있다.
단, if 문과 달리 #endif 지시자로 조건부 컴파일의 끝을 명시해야 한다.
#ifdef
if defined의 줄임말이다.
#ifdef 지시자 다음에 나오는 매크로 이름과 같은 이름의 매크로가 이미 정의되어 있으면 해당 내용을 컴파일한다.
마찬가지로 #elif, #else 지시자를 사용할 수 있으며
#endif로 끝을 명시해야 한다.
#ifndef
ifdef의 not이 붙은 지시자로 not이 붙는 것 외에는 ifdef 지시자와 기능이 동일하다.
즉, #ifndef 지시자 다음에 나오는 매크로 이름과 같은 이름의 매크로가 정의되어 있지 않으면 해당 내용을 컴파일한다.
레퍼런스
http://www.tcpschool.com/c/c_complie_module
http://www.tcpschool.com/c/c_compile_condCompile
'development > C' 카테고리의 다른 글
C 언어의 실행 파일 생성 과정 (0) | 2023.01.04 |
---|