헤더파일 내용이 중복되어 컴파일 에러가 발생할 수 있고 이를 방지하는 지시자는 두 가지 종류가 있습니다
아래의 예문을 통해 이중선언을 회피하는 방법을 알아보겠습니다.
헤더파일 이중선언이란?
main.c
1
2
3
4
5
6
7
8
9
|
#include<stdio.h>
#include "header1.h"
#include "header2.h"
int main(){
printf("sum1: %d", sum());
printf("sum2: %d", sum2());
return 0;
}
|
cs |
header1.h
1
2
3
|
/* header1.h */
int sum(int a, int b);
|
cs |
header2.h
1
2
3
|
/* header2.h */
int sum2(int x, int y);
|
cs |
위와 같은 코드가 있습니다.
main.c파일에서는 header1과 header2를 포함하고있는데 header2.h에서도 header1.h를 포함하기 때문에 컴파일 에러가 발생할 수 있습니다.
그림으로 표현하면 아래와 같습니다
header1.h가 두 번 포함되기 때문에 이를 회피할 방법을 찾아야 합니다
해결#1 #ifndef
1
2
3
4
5
6
|
/* header1.h */
#ifndef _HEADER1_H_
#define _HEADER1_H_
int sum(int a, int b);
#endif
|
cs |
두번 포함되는 header1.h에 조건문을 붙여 한번만 실행되게 하는 코드입니다.
main.c에서 참조할 순서는 header1.h -> header2.h
첫번째 header1.h :
1번 라인에서 _HEADER1_H_가 아직 정의되지 않았기 때문에 10번endif를 만날때까지 아래의 코드를 실행
2번 라인에서 _HEADER1_H_를 정의
10번 라인 #endif에서 종료
두번 째 header1.h :
header2.h에서도 header1.h를 참조하기 때문에 다시 header1.h로
이 때 _HEADER1_H_가 이미 정의되었기 때문에 #idndef ~ #endif까지는 코드를 실행하지않음
해결#2 #pragma once
두 번 참조되는 헤더파일인 header1.h의 최상단에 #pragma once를 붙이면 자동으로 두번째는 읽기조차 하지 않는다
때문에 컴파일 속도가 올라갈 수 있다
1
2
3
4
5
|
/* header1.h */
#pragma once
int sum(int a, int b);
#endif
|
cs |
정리
컴파일러에 따라 자동으로 회피되거나 #pragam once를 지원하지 않을 수 있으므로 주의가 필요합니다
때문에 안정성과 범용성에 있어서 #ifndef ~ #endif를 쓰는게 좋을 수 있습니다
'💻CS > 정리용' 카테고리의 다른 글
개발 기술 블로그 모음 (Tech Blog) (0) | 2021.09.30 |
---|---|
HTTP GET, POST 방식 비교 (0) | 2021.09.27 |
에디트 플러스 한글이 깨짐, 인코딩 변경 / Edit Plus 인코딩 (0) | 2021.09.26 |
PHP 한글 깨짐 현상, 인코딩 해결방법 (0) | 2021.05.08 |
glut32.dll이(가) 없어 프로그램을 시작할 수 없습니다. (glut.dll 포함) (0) | 2021.04.02 |
댓글