Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ADONE 코딩하기

[C언어] #include 정보 본문

C언어

[C언어] #include 정보

피곤하신분 2023. 2. 11. 17:16

참고 : https://wikidocs.net/101941

 


#include의 형태는 두가지이다. 

  1. #include <filename>
  2. #include "filename"

1번 형식은 시스템 헤더파일이 모아져 있는 폴더로 가서 filename에 해당하는 파일을 찾는 것이다. 자주 사용하는 

<stdio.h> <stdlib.h> <string.h> 등이 여기에 해당한다.

 

2번 형식은 1번 형식보다 더 넓은 의미에서 include 명령을 실행한다. 먼저 파일을 작성하고 있는 파일의 현재 폴더에서 filename에 해당하는 이름의 파일을 찾고, 만약 발견하지 못한다면 1번 형식처럼 시스템 헤더파일이 모인 폴더로 가서 filename을 서칭한다. 

프로그래머가 직접 작성한 헤더파일들은 대부분 2번 형식을 사용해야한다. 

 

∵ 2번 형식이 더 넓은 의미에서 include 명령을 할 때 편할 수 있겠지만, 명백하게 시스템 헤더파일인 파일을 include 할때에는 굳이 현재 폴더에서 서칭할 필요는 없으므로 <>를 붙여 1번 형식을 사용하는 것이 효율적일 것이라 생각한다.

 

2번 형식에서 "filename"으로 파일명을 명시해 줄 수 있지만, 절대경로를 사용해 "/usr/inlcude/filename.h"처럼 헤더파일 위치를 직접 적용할 수도 있다. 

하지만 이 방법은 잘못된 방법이다. 보기엔 문제가 없어보이지만 프로그램을 다른 컴퓨터로 이식할 때 절대경로가 맞지않는 불상사가 일어나 코드를 수정해야하는 일이 발생하기 때문에 문제가 된다. 때문에 절대경로로 위치를 설정하는 것 보다는 상대적인 위치로 "../include/utils.h" 나 1번 형식처럼 시스템헤더파일 위치를 알아서 찾아가게하는 코드로 작성해 이식성을 높이는 것이 올바른 include 코드 작성법이다. 


외부변수 extern

한 소스파일에서 선언한 변수 etx가 있다. 이 변수를 다른 소스파일에서도 공유하고 싶다면 extern 선언을 사용해 공유 변수로 사용할 수 있다.

int ext;
////////////////
extern int ext;

 

변수 선언은 컴파일러에게 변수가 존재할 공간을 할당해 달라는 명령이다.

extern 을 명시하게 되면 컴파일러에게 다른 소스파일에서 이미 선언되어 있어 할당된 공간이 존재하는 변수이므로, ext 변수를 위해 따로 공간을 할당하지않아도 된다고 알려주는 것이다. 

 

extern 은 자료형에 따른 제약이 없으며 배열에도 사용가능하다. 배열에 사용할 때에는 배열의 크기를 생략해서 사용할 수도 있다.

int a[10];
///////////////
extern int a[];

 


헤더파일 보호 기법

 

#ifndef HEAD_H
#define HEAD_H

.
.
.

#endif /* HEAD_H */

a.h 파일을 include한 b1.h 와 b2.h 파일이 있다고 가정하자.

만약 main.c 파일에서 b1.h와 b2.h를 동시에 include하게 되면 a.h 파일은 중복으로 include되어 오류가 발생하는 상황을 맞닥뜨릴 수 있다. 이를 다중 인클루드라고 하는데, 위의 코드처럼 #ifndef - #endif 로 감싸주어 보호하면 해결할 수 있다. 

 

정의되어 있지 않다면(최초로 정의할 때) 헤더파일을 include하고 이미 정의가 되어있다면(다중 인클루드를 시도할 때) if station을 돌지 않아 중복으로 인클루드하는 상황을 방지한다. 

 

다중 인클루드는 무조건 오류가 발생하는 것은 아니다. 하지만, 불필요하게 재컴파일을 하는 상황도 나올 수 있기 때문에 효율성을 보았을 때도 이점이 있다.


 

'C언어' 카테고리의 다른 글

[C언어] 코드 분석 중 발견한 함수들  (1) 2023.03.01
[c언어] 리눅스 make 명령  (0) 2023.02.04