프로그래밍 언어/C

[컴파일] 헤더파일, 분할 컴파일, 조건부 컴파일

순정법사 2023.08.17
더보기

 

C 언어에서 실행파일을 생성하는 순서 중 컴파일에 대한 부분을 공부할 예정!

 

 

A. 헤더 파일

1. 헤더 파일(header file)

a. 헤더파일이란?

C언어에서 함수는 사용되기 전 함수의 원형이 선언되어야 함 (이 원칙은 표준 함수에도 적용)

 

🌟 이러한 표준 함수의 원형 및 표준 함수와 관련된 다양한 정보를 가지고 있는 파일을 표준 헤더 파일

 

  • 사용자는 자신만의 사용자 헤더 파일을 자유롭게 만들 수 있음
  • 확장자 .h
  • #include 선행처리 지시자를 사용해 다른 파일에 포함시킬 수 있음

 

b. 표준 헤더 파일

다양한 정보를 가지고 있는 파일이라 크기가 크지만, 큰 헤더파일이라고 프로그램 크기가 커지는건 X

헤더 파일의 내용은 실행파일에 추가되는 내용보다 컴파일러가 실행 파일을 만드는데 사용하는 정보가 대부분이기 때문

 

💙 표준 헤더 파일에 저장되는 정보

 

1) 표준 함수의 원형

2) 표준 함수의 매크로 상수

3) 표준 함수의 사용자 정의 타입(구조체, 공용체) 정의

4) 매크로 함수의 정의

 

c. 사용자 헤더 파일

자신의 프로그램에  사용하기 위해 자신만의 헤더 파일을 작성할 수 있음

이러한 헤더 파일을 이용하면, 여러 파일에서 같이 공유하는 외부 변수를 선언할 수도 있음

 

 

 


B. 분할 컴파일

1. 모듈

a. 모듈이란?

🌟 프로그램을 구성하는 구성 요소, 관련된 데이터와 함수를 하나로 묶은 단위를 의미

 

하나의 소스파일에 모든 함수를 작성하지 않고, 함수의 기능별로 따로 모듈을 구성함

이러한 모듈을 합쳐 하나의 파일로 작성하는 방식으로 프로그램을 만들게 됨

 

➡ 이처럼 프로그램 코드를 기능별로 나눠서 독립된 파일에 저장하여 관리하는 방식을 모듈화 프로그래밍이라고 함

 

 

2. 분할 컴파일

a. 분할 컴파일이란?

작성된 모듈(module)은 개별적으로 컴파일된 후, 링커에 의해 하나의 실행 파일로 만들어짐

🌟  이렇게 하나의 실행파일을 만들기 위해 소스파일을 여러 개로 나누어서 개발하는 방식을 분할 컴파일 방식이라고 함

 

링크 : 최종적인 실행 파일의 생성을 위해서 접근하는 변수나 호출하는 함수가 어디에 있는지 서로 연결해주는 작업

 

👉 여기에서 미리 공부했음!

 

C언어와 프로그램의 이해

더보기 [목차] A. C언어 개요 B. 프로그래밍 언어와 프로그래밍 C. C 프로그램 개요 A. C언어 개요 1. C언어 기초 a. C언어란? 🌟 절차 지향 프로그래밍 언어(procedure-oriented programming language) 저급언어 +

monamu.tistory.com

 

b. extern 키워드

분할 컴파일 방식에서 소스 파일 사이의 상호 참조는 전역 변수와 전역 함수만 가능

기본적으로 C 컴파일러는 전역변수를 해당 파일에서 찾는데,

외부파일에서 참조하는 전역변수는 컴파일러에게 외부 파일에 존재하는 변수라고(extern) 알려줘야 함

 

extern 키워드가 붙은 전역 변수는 컴파일된 후, 링크 때가 돼서야 실제로 연결

 

c. static 키워드

분할 컴파일 방식에서 변수의 접근 영역을 해당 파일로만 한정시키고자 할 때 = static 키워드

 

extern 키워드로 선언된 변수와 static 키워드로 선언된 변수에 접근할 수 있는 영역을 도식화

 

👉 여기에서 미리 공부했음!

 

변수 총정리

A. 변수(variable) 1. 변수 기초 a. 변수란? 🌟 가변적인 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간 b. 변수의 선언 🌟 변수를 사용하기 전에 반드시 먼저 해당 변수

monamu.tistory.com

 

 

 


C. 조건부 컴파일

1. 조건부 컴파일(conditional compile)

🌟  지정한 조건에 따라 코드의 일정 부분을 컴파일할지 안 할지를 지정

 

조건부 컴파일 지시자는 아래와 같이 세가지가 있음

 

a. #if

if 조건문과 매우 비슷, 하지만 컴파일 지시자를 조건문처럼 사용하는 경우는 없다

 

📘 문법

#if 조건식1
    컴파일할 명령문1
#elif 조건식2
    컴파일할 명령문2
#else
    컴파일할 명령문3
#endif

 

🤍 문법 설명

 

1) 조건식의 결과가 0 = 거짓, 나머지 참

2) #elif 지시자를 사용해 조건을 여러개 사용 가능

3) #else 지시자를 사용해 모든 조건에 해당하지 않는 경우 지정

4) #endif 지시자를 사용해 반드시 조건부 컴파일의 끝을 명시

 

b. #ifdef

🌟 같은 이름의 변수나 함수가 중복으로 선언될 가능성을 없애는 조건부 컴파일 지시자

 

ifdef는 if defined라는 문장을 줄여서 만든 것

 

📘 문법

#ifdef 매크로이름	//1)
    컴파일할 명령문1	
#elif 조건식	//2)
    컴파일할 명령문2
#else	//2)
    컴파일할 명령문3
#endif

 

🤍 문법 설명

 

1) 매크로 이름과 같은 이름의 매크로가 이미 정의되어 있으면 명령문1 실행. 정의되어 있지 않으면 명령문 1은 실행되지 않고 넘어감

2) #if 조건부 컴파일 지시자와 동일하게 #elif, #else 지시자를 사용해 컴파일 조건을 확장할 수 있음

 

c. #ifndef 

위 #ifdef의 반대 (if not defined)

정의되어 있지 않으면 명령문을 실행한다!!

 

📘 문법

#ifndef 매크로이름	
    컴파일할 명령문1	
#elif 조건식	
    컴파일할 명령문2
#else	
    컴파일할 명령문3
#endif

 

👉 사용자 헤더 파일을 선언할 때에는 중복 선언을 피하기 위해 파일 내의 모든 내용을 #ifdef나 #ifndef, #endif 지시자로 감싸는 것이 좋음

 

 

 


출처 : http://www.tcpschool.com/c/c_compile_headerFile

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com