헤더파일 만들기 (*.h)

6573 단어 CCodingC

  • 헤더 파일의 구성

헤더 파일의 기본형식은 아래의 구성을 따른다.

// this .h file's name is "awesome_lib.h"

// start here to define new lib.h file
#ifndef __AWESOME_LIB_H__
# define __AWESOME_LIB_H__

[include할 다른 헤더 파일 명시]

[상수 및 매크로 정의]

[사용자 type 정의 ; type, struct]

[전역 변수 선언]

[함수 선언]

// end here to define new lib.h file
#endif

1. 시작은 #ifndef / ~#define~ / 끝은 endif

헤더 파일의 시작은 #ifndef [헤더 구분자]로, 끝은 #endif로 감싼다. #ifndef [헤더 구분자] 바로 다음에는 #define 문을 위치시킨다.

[헤더 구분자] 의 명명 규칙은 아래와 같다.

  1. 헤더 파일명에서 소문자를 대문자로 바꾸고,
  2. 온점 . 을 언더바 _ 로 바꾸고
  3. 파일 이름 앞뒤로 두 개의 언더바 __ 를 붙인다.

예를 들어...

awesome_lib.h => __AWESOME_LIB_H__
my_str_ft.h => __MY_STR_FT_H__
PROJECT_HEADER.hpp => __PROJECT_HEADER_HPP__

2. 다른 헤더파일 include

헤더 파일의 특징은 파일 내에 따로 로직을 구현하지 않는다는 것이다. 따라서 코드로직을 고려하지 않기에 따로 stdio.hunistd.h와 같은 다른 헤더파일을 include하지 않는다. 그러나 다른 헤더파일에 선언된 type을 신규로 만들어지는 함수의 파라미터나 리턴으로 사용하는 경우에는 어쩔 수 없이 #include <대상 헤더파일>할 수 밖에 없다.

>> write 함수에 파라미터로 던져주는 메세지를 정의하는 경우
#ifndef __NBR_BOOLEAN_H__
# define __NBR_BOOLEAN_H__

#include <unistd.h>
...
...

# define EVEN_M "there is an even number.\n"
# define ODD_M "there is an even number.\n"

3. 상수 및 매크로 정의

상수 또는 매크로를 선언할 때는 #define 을 쓰거나 const를 쓴다.

// #define [상수명]	[상수값]
#define	PI	3.141592
#define	ROOT_PI	1.772453

// 혹은

// const [type] [상수명] = [상수값]
const double PI = 3.141592
const double ROOT_PI = 1.772453

4. 사용자 type 정의

사용자 정의 type을 기술하는 부분이다. 이 부분에서는 사용자 정의 type인 struct, union 등을 정의한다.

typedef struct {
	char name[20];
    int age;
    char gender;
    char addr[128];
    ......
} custom_t;

typdef long int file_size_t;

......

5. 전역 변수 선언

전역변수는 .c에서 정의된 변수를 다른 곳에서도 사용하기 위하여 헤더에 선언하며, 그 앞에는 반드시 extern 키워드를 덧붙인다.

extern long long gl_all_strs_len;

extern을 붙이는 것은 변수가 해당 파일이 아닌 다른 파일에 정의되어 있으며, 해당 구문에서는 그 정의를 끌어다 쓰는 것을 의미한다. extern을 붙이지 않았을 시, 헤더파일은 해당 변수를 선언이 아닌 정의한다. 이 경우, 해당 헤더파일을 include 한 소스에서 전역변수가 정의되는 결과를 낳기에 전역변수 오류가 날 가능성이 있다. 물론 위처럼 쓰기 위해 .c 소스 중 한 군데에서 long long gl_all_strs_len;을 정의하는 정의부가 있어야 한다.

6. 함수 선언

여기서는 함수의 프로토타입을 선언한다.

extern int sum(int nbr1, int nbr2);
extern int sum(int, int); // 굳이 들어가는 파라미터의 이름을 지칭하지 않아도 된다.
extern int init(void) // 파라미터가 아무것도 들어가지 않는 경우 [함수명](void)라고 꼭 지칭하여야 한다.

좋은 웹페이지 즐겨찾기