Download presentation
Presentation is loading. Please wait.
1
Chapter 27. 파일의 분할과 헤더파일의 디자인
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 27. 파일의 분할과 헤더파일의 디자인
2
윤성우의 열혈 C 프로그래밍 Chapter 파일의 분할 윤성우 저 열혈강의 C 프로그래밍 개정판
3
파일을 그냥 나눠도 될까요? 윤성우의 열혈 C 프로그래밍 컴파일러는 파일 단위로 컴파일! 원본 파일 num이 뭐냐?
Increment 함수는 어디 있는 거야?
4
외부 선언 및 정의 사실을 컴파일러에게 알려줘야...
윤성우의 열혈 C 프로그래밍 외부 선언 및 정의 사실을 컴파일러에게 알려줘야... int형 변수 num이 다른 파일에 존재함을 컴파일러에게 알리는 문장 void Increment(void) 함수와 int GetNum(void) 함수가 다른 파일에 정의되었음을 알리는 선언 키워드 extern 이 외부에 존재함을 알리는 용도로 사용된다.
5
전역변수의 static 선언의 의미 윤성우의 열혈 C 프로그래밍 지역변수로 선언되는 경우 전역변수로 선언되는 경우
함수 내에서만 접근이 가능한, 전역변수와 마찬가지로 한번 메모리 공간에 저장되면 종료 시까지 소멸되지 않고 유지되는 변수의 선언 void SimpleFunc(void) { static int num=0; } 전역변수로 선언되는 경우 이 경우 int num은 전역변수이다. 단 외부 소스파일에서 접근이 불가능한 전역변수가 된다. 즉, 접근의 범위를 파일로 제한하게 된다. static int num=0; void SimpleFunc(void) { }
6
Chapter 27-2. 둘 이상의 파일을 컴파일 하는 방법과 static에 대한 고찰
윤성우의 열혈 C 프로그래밍 Chapter 둘 이상의 파일을 컴파일 하는 방법과 static에 대한 고찰 윤성우 저 열혈강의 C 프로그래밍 개정판
7
파일부터 정리하고 시작합시다. 윤성우의 열혈 C 프로그래밍 #include <stdio.h>의
이 세 개의 파일을 하나의 프로젝트 안에 담아서 하나의 실행파일을 생성해 보는 것이 목적! #include <stdio.h>의 선언은 생략이 되어 있다! 다중파일 컴파일 방법 두 가지 ∙ 첫 번째 방법 → 파일을 먼저 생성해서 코드를 삽입한 다음에 프로젝트에 추가한다. ∙ 두 번째 방법 → 프로젝트에 파일을 추가한 다음에 코드를 삽입한다.
8
존재하는 파일, 프로젝트에 추가하는 방법 윤성우의 열혈 C 프로그래밍 이미 존재하는 소스파일을 추가하는 방법 1단계
아래에서 보이듯이 다수의 파일이 하나의 프로젝트 안에 포함되었음이 솔루션 탐색기에 나타나야 한다. 추가결과 확인 2단계
9
프로젝트에 새로운 파일을 추가하는 방법 윤성우의 열혈 C 프로그래밍 새로운 소스파일을 만들어서 추가하는 방법
이는 기존에 해왔던, 소스파일을 새로 생성해서 프로젝트에 추가하는 방법과 100% 동일하다. 그 과정을 재차 진행하면 새로운 소스파일을 생성해서 프로젝트 내에 포함시킬 수 있다.
10
함수에도 static 선언을 할 수 있습니다. 윤성우의 열혈 C 프로그래밍 static void MinCnt(void) {
} 함수의 static 선언은 전역변수의 static 선언과 그 의미가 동일하다. 즉, 외부 소스파일에서의 접근을(호출을) 허용하지 않기 위한 선언이다.
11
윤성우의 열혈 C 프로그래밍 Chapter 헤더파일의 디자인과 활용 윤성우 저 열혈강의 C 프로그래밍 개정판
12
두 개의 헤더파일과 하나의 소스파일로 이뤄진 프로젝트
윤성우의 열혈 C 프로그래밍 #include 지시자와 헤더파일의 의미 두 개의 헤더파일과 하나의 소스파일로 이뤄진 프로젝트 선행처리 이후의 결과 위의 그림을 통해서 이해할 수 있듯이 #include 지시자는 헤더파일을 단순히 포함시키는 기능을 제공한다. 그리고 기본적으로 헤더파일에는 무엇이든 넣을 수 있다. 그러나 아무것이나 넣어서는 안 된다.
13
#include <헤더파일 이름>
윤성우의 열혈 C 프로그래밍 헤더파일을 include 하는 두 가지 방법 표준 헤더파일의 포함 #include <헤더파일 이름> 표준헤더 파일을 포함시킬 때 사용하는 방식이다. 표준헤더 파일이 저장된 디렉터리에서 헤더파일을 찾아서 포함을 시킨다. 프로그래머가 정의한 헤더파일의 포함 #include "헤더파일 이름" 프로그래머가 정의한 헤더파일을 포함시킬 때 사용하는 방식이다. 이 방식을 이용하면 이 문장을 포함하는 소스파일이 저장된 디렉터리에서 헤더파일을 찾게 된다.
14
절대경로의 지정과 그에 따른 단점 윤성우의 열혈 C 프로그래밍
이렇듯 헤더파일의 경로를 명시할 수도 있다. #include "C:\CPower\MyProject\header.h" #include "/CPower/MyProject/header.h" Windows의 절대경로 지정방식. Linux의 절대경로 지정방식 ▶ 절대경로를 지정하면 프로그램의 소스파일과 헤더파일을 임의의 위치로 이동시킬 수 없다(동일 운영체제를 기반으로 하더라도). ▶ 운영체제가 달라지면 디렉터리의 구조가 달라지기 때문에 경로지정에 대한 부분을 전면적으로 수정해야 한다.
15
상대경로의 지정 방법 윤성우의 열혈 C 프로그래밍 #include "header.h"
#include "Release\header0.h" #include "..\CProg\header1.h" #include "..\..\MyHeader\header2.h" 이 문장을 포함하는 소스파일이 저장된 디렉터리 :현재 디렉터리 현재 디렉터리의 서브인 Release 디렉터리 현재 디렉터리의 상위 디렉터리의 서브인 Cporg 디렉터리 현재 디렉터리의 상위 디렉터리의 상위 디렉터리의 서브인 MyHeader 디렉터리 위와 같은 형태로(상대경로의 지정방식을 기반으로) 헤더파일 경로를 명시하면 프로그램의 소스코드가 저장되어 있는 디렉터리를 통째로 이동하는 경우 어디서든 컴파일 및 실행이 가능해진다.
16
헤더파일에 삽입이 되는 가장 일반적인 선언의 유형
윤성우의 열혈 C 프로그래밍 헤더파일에 무엇을 담으면 좋겠습니까? 헤더파일에 삽입이 되는 가장 일반적인 선언의 유형 extern int num; extern int GetNum(void); // extern 생략 가능 ▶ 총 7개의 소스파일과 헤더파일로 이뤄진 예제를 통해서 다음 두 가지에 대한 정보를 얻자! • 소스파일을 나누는 기준 • 헤더파일을 나누는 기준 및 정의의 형태 ▶ 예제의 소스파일과 헤더파일의 구성 • basicArith.h basicArith.c • areaArith.h areaArith.c • roundArith.h roundArith.c • main.c
17
헤더파일과 소스파일의 포함관계 윤성우의 열혈 C 프로그래밍 areaArith.h basicArith.h roundArith.h
▶ 예제의 소스파일과 헤더파일의 구성 및 내용 • basicArith.h basicArith.c → 수학과 관련된 기본적인 연산의 함수의 정의 및 선언 • areaArith.h areaArith.c → 넓이계산과 관련된 함수의 정의 및 선언 • roundArith.h roundArith.c → 둘레계산과 관련된 함수의 정의 및 선언 • main.c areaArith.h basicArith.h roundArith.h basicArith.c #include #include areaArith.c roundArith.c #include #include main.c
18
basicArith.h & basicArith.c
윤성우의 열혈 C 프로그래밍 basicArith.h & basicArith.c basicArith.h : 기본연산 함수의 선언 basicArith.c : 기본연산 함수의 정의 매크로의 정의는 파일단위로 유효하다. 그래서 PI와 같은 상수의 선언은 헤더파일에 정의하고, 이를 필요한 모든 소스파일이 PI가 선언된 헤더파일을 포함하는 형태를 띤다.
19
areaArith.h & areaArith.c
윤성우의 열혈 C 프로그래밍 areaArith.h & areaArith.c areaArith.h : 넓이계산 함수의 선언 areaArith.c : 넓이계산 함수의 정의
20
roundArith.h & roundArith.c
윤성우의 열혈 C 프로그래밍 roundArith.h & roundArith.c roundArith.h : 둘레계산 함수의 선언 roundArith.c : 둘레계산 함수의 정의
21
윤성우의 열혈 C 프로그래밍 main.c 실행결과
22
구조체의 정의는 어디에? : 문제의 제시 윤성우의 열혈 C 프로그래밍 소스파일 intdiv.c 소스파일 main.c
구조체의 정의도 파일 단위로만 그 선언이 유효하다. 따라서 필요하다면 동일한 구조체의 정의를 소스파일마다 추가시켜 줘야 한다. 소스파일 intdiv.c 소스파일 main.c 같은 구조체 정의를 둘 이상의 소스파일에 직접 추가시킨다는 것 자체가 부담!
23
구조체의 정의는 어디에? : 해결책의 제시 윤성우의 열혈 C 프로그래밍 헤더파일 stdiv.h 소스파일 main.c
구조체의 정의도 헤더파일에 넣어두고 필요할 때마다 include 하는 것이 일반적이다! #include #include 소스파일 main.c 소스파일 intdiv2.c
24
헤더파일의 중복삽입 문제 윤성우의 열혈 C 프로그래밍
헤더파일을 직접적으로 또는 간접적으로 두 번 이상 포함하는 것 자체는 문제가 아니다. 그러나 두 번 이상 포함시킨 헤더파일의 내용에 따라서 문제가 될 수 있다. 일반적으로 선언(예로 함수의 선언)은 두 번 이상 포함시켜도 문제되지 않는다. 그러나 정의(예로 구조체 및 함수의 정의)는 두 번 이상 포함시키면 문제가 된다. main.c는 결과적으로 구조체 Div의 정의를 두 번 포함하는 꼴이 된다! 그런데 구조체의 정의는 하나의 소스파일 내에서 중복될 수 없다!
25
조건부 컴파일을 활용한 중복삽입 문제의 해결 윤성우의 열혈 C 프로그래밍 중복 삽입문제의 해결책
매크로 __STDIV2_H__ 와 #ifndef의 효과가 main.c에서 어떻게 나타나는지 그려보자.! 위와 같은 이유로 모든 헤더파일은 #ifndef~#endif로 감싸는 것이 안전하고 또 일반적이다!
26
'윤성우의 열혈 C 프로그래밍을 사랑해 주신 여러분께 진심으로 감사드립니다.
강의가 끝났습니다. '윤성우의 열혈 C 프로그래밍을 사랑해 주신 여러분께 진심으로 감사드립니다. Chapter 27이 끝났습니다. 질문 있으신지요?
Similar presentations