2015년 7월 28일 화요일

20150729 파일의 분할과 헤더파일의 디자인(메인함수==entry point)

★★★분할 컴파일★★★
분할된 파일들을 cl /c 파일명으로 각각 컴파일하면 *.obj파일들이 생성되는데
이 *.obj 파일을 cl 파일명(파일명.exe 파일생성됨) 파일명~파일명으로 링크 단계를
완성시키면 정상적으로 실행되는 실행파일이 생성된다!
☆cl /c main.c -> cl /c func.c -> cl /c num.c -> cl main.obj func.obj num.obj -> main.exe

☆외부에 선언 및 정의되었다고 컴파일러에게 알려줘야 한다!
extern int num; // int형 변수 num이 외부에 선언되어 있다!
extern Increment(void); // void Increment(void) 함수가 외부에 정의되어 있다!
☆함수가 외부에 정의되어 있음을 알릴 때는 extern 선언을 생략가능

★다른 파일에서 접근을 못하게 하고 싶다면 static!(전역변수의 static선언은 아래의 의미)
"이 변수는 외부 파일에서의 접근을 허용하지 않는다!"(보안 속성)
"이 변수의 접근 범위는 파일 내부로 제한한다!"
보안상의 이유와 프로젝트 분할 작업시 동일한 변수명이 있을때를 위해서 사용한다!
★함수에도 사용가능!!★

★★★헤더파일을 include 하는 두 가지 방법★★★
#include <헤더파일 이름> // 첫 번째 방식
#include "헤더파일 이름" // 두 번째 방식

☆이 둘의 유일한 차이점은 포함시킬 헤더파일의 기본 경로인데, 첫 번째 방식을 사용하면
표준 헤더파일(C의 표준에서 정의하고 있는, 기본적으로 제공되는 헤더파일)이 저장되어
있는 디렉터리에서 파일을 찾게 된다! 때문에 이 방식은 stdio.h, stdlib.h, 그리고 string.h
와 같은 표준 헤더파일을 포함시킬 경우에 사용된다!
☆반면 두 번째 방식을 사용하면, 이 문장을 포함하는 소스파일이 저장된 디렉터리에서
헤더파일을 찾는다! 때문에 프로그래머가 정의하는 헤더파일을 포함시킬 때 사용하는 방식!
그리고 이 방식을 사용하면 다음과 같이 헤더파일의 이름뿐만 아니라, 드라이브 명과
디렉터리 경로를 포함하는 '절대경로(완전경로)'를 명시 해서 헤더파일을 지정할 수 있다!
#include "C:\CPower\MyProject\header.h" // Windows 상에서의 절대경로 지정
#include "/CPower/MyProject./header.h" // Linux 상에서의 절대경로 지정
☆dos상에서 \=절대경로(cd \programfiles\atmel에서 첫번째 \는 최상위 위치)
☆.\..\ //\앞에 점=상대경로(첫번째 점하나는 현재위치 두번째 점 두개는 상위 위치)

☆상대경로의 지정 방법
드라이브 명과 디렉터리 경로를 포함하는 방식을 가리켜 '절대경로'라 하는 이유는
"절대로 경로가 변경되지 않는다. 컴퓨터를 옮겨도 지정한 경로는 변경되지 않는다!"
상대경로는 실행하는 컴퓨터의 환경에 따라서 경로가 바뀌기 때문!
#include "Release\header0.h" /* 소스파일이 있는 디렉터리의 하위 디렉터리인 Release
디렉터리에 존재하는 header0.h를 포함하라! */
#include "..\CProg\header1.h" /* 한 단계 상위 디렉터리의 하위 디렉터리인 CProg에
존재하는 header1.h를 포함하라! */
#include "..\..\MyHeader\header2.h" /* 두 단계 상위 디렉터리의 하위 디렉터리인
MyHeader에 존재하는 header2.h를 포함하라! */

댓글 없음:

댓글 쓰기