본문 바로가기
💻CS/정리용

헤더파일 이중선언, 파일 중복 방지 #pragma once

by 둥둥동동# 2021. 9. 5.
728x90

헤더파일 내용이 중복되어 컴파일 에러가 발생할 수 있고 이를 방지하는 지시자는 두 가지 종류가 있습니다

아래의 예문을 통해 이중선언을 회피하는 방법을 알아보겠습니다. 

 

헤더파일 이중선언이란?

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를 쓰는게 좋을 수 있습니다

 

728x90
반응형

댓글