1. #ifndef, #define, #endif
임의로 만든 헤더파일 안에는 항상 아래와 같은 형식으로 내용을 처리하여 준다. 하나의 헤더 파일만 사용한다면 크게 의미가 없겠으나, 다수의 헤더 파일을 작성하고 헤더 파일이 헤더 파일을 include하게 될 경우가 분명 생긴다. 이 경우, 아래와 같이 중복 방지 처리를 해주지 않는다면 언젠가 꼬여버려서 하나의 C파일 혹은 헤더 파일이 동일한 헤더 파일을 2번 이상 include하게 되는 경우가 생길 수 있다. 그렇게 된다면 컴파일 에러가 뜨니 중복 방지 처리에 습관을 들여주자.
헤더 파일 이름은 hello.h라고 가정한다면, hello.h의 내용은 아래와 같다.
#ifndef HELLO_H
# define HELLO_H
(내용)
#endif
(1) #ifndef & #define
c 파일에서 #include "hello.h" 를 통해 hello.c 헤더 파일을 인클루드하고자 한다면 가장 먼저 ifndef(if not defined) 구문으로 들어온다. 만약 c 파일에서 hello.h가 정의되어 있지 않았다면 hello.h를 정의하겠다는 얘기다.
여기서 주의할 점은 헤더 파일의 이름 중 영어는 모두 대문자로 기재해줘야 하며, 언더바(_)는 물론이고 온점(.) 또한 언더바로 기재해줘야 한다.
또한, norminette에 따라 #if, #ifndef, #ifdef 뒤에는 들여쓰기를 해줘야 하는데 탭이 아니고 스페이스 하나로 들여쓰기를 해준다.
(2) #endif
#define HELLO_H 아래에 정의할 내용을 써준 후 #endif를 하면 ifndef의 조건에 충족되어 define 하던 내용을 마무리하고 ifndef 구문을 종료하겠다는 시그널이다.
2. 헤더 파일에서 정의할 수 있는 것들
사실 헤더 파일에서 정의할 수 있는 것들은 C 파일 안에서도 모두 정의가 가능하다. 주로 헤더 파일에 정의하는 것들을 기재하는 것이며, 특히 42서울 라피신 과정에서는 구조체를 C 파일에서 정의하면 안 된다는 규칙이 있으므로 꼭 헤더 파일에서 정의해주자.
(1) 다른 헤더 파일을 include
기존의 헤더 파일을 include하려면 #include <헤더파일명>을, 임의로 만든 헤더 파일을 include 하려면 #include "헤더파일명"을 적어준다. 이렇게 헤더 파일이 헤더 파일을 include하게 설계한다면, C 파일에서 많은 헤더 파일을 include하지 않아도 된다.
(2) 함수 선언문
헤더 파일에서 함수를 선언할 때는 선언만 해주고, 정의는 C 파일 안에 작성토록 한다. A 파일에서 정의한 함수를 B 파일에서 사용해야 한다면 두 파일 모두 같은 헤더 파일을 include하고 있어야 한다. 자세한 내용은 아래 그림을 보고 이해하자. 더욱 자세한 내용이 필요하다면 그림을 클릭해서 코딩 도장 사이트로 이동하여 다시 확인하자.
(3) #define 전처리기를 통한 상수 혹은 문자열 치환
#define [치환할 이름] [치환할 내용] 과 같은 형태로 특정 상수에 대해 심볼릭 상수와 문자열을 정의할 수 있다.
#define TRUE 1 // 이후 C 파일에서 TRUE는 상수 1로 사용됨
#define FALSE 0 // 이후 C 파일에서 FALSE는 상수 0으로 사용됨
#define GREET "Hello!" // 이후 C 파일에서 GREET는 문자열 "Hello!"로 사용됨
(4) #define 전처리기를 통한 명령문 치환
#define [치환할 명령문] [명령문의 내용] 과 같은 형태로 특정 명령문을 치환할 수 있다.
#define POW(VALUE) (VALUE * VALUE)
// 이후 C 파일에서 POW(3)을 쓰면 3 * 3 인 9로 사용할 수 있음
참고로 42서울 norminette에 의해 명령문은 #define할 수 없다. (norminette 검사를 하지 않는 서브젝트 제외)
(5) 구조체
아까 언급했다시피 42서울 norminette에 의해 구조체는 반드시 헤더 파일 안에 정의되어야 한다. 구조체와 관련된 내용은 구조체 정리 글을 통해 확인하자!
3. norminette를 고려한 헤더 파일 예시
// hello.h
#ifndef HELLO_H
# define HELLO_H
# include <unistd.h>
# define TRUE 1
# define FALSE 0
typedef struct s_member
{
char number[30];
char name[30];
int age;
} t_member;
char ft_putchar(char c);
int ft_strlen(char *str);
#endif
주의할 점
1. #ifndef의 조건이 충족된다면, 바로 아래 '# define HELLO_H' 부터 그 구문 안에서 이루어지는 include와 define은 '#'와 스페이스 하나 간격을 유지해야 한다. 즉, #include ~나 #define ~이 아닌 # include ~ 나 # define ~으로 해줘야 한다.
2. 구조체나 함수 등의 정의는 구조체와 함수의 norminette만 지켜주면 된다.
레퍼런스
1. 코딩도장 챕터 76.3, 챕터 77 전체
2. 기리핑님의 블로그
'Dev > 42Seoul' 카테고리의 다른 글
open, read, close 함수 정리 (0) | 2020.07.18 |
---|---|
구조체 정리 (0) | 2020.07.16 |