개발/C와 C++

[c/c++] #pragma once, 헤더파일 중복 피하기

어중E 2022. 10. 2. 16:30

[c/c++] #pragma once, 헤더파일 중복 피하기

C/C++에서는 헤더 파일의 중복으로 2번 불러와질 수 있습니다. 이때에는 컴파일러 에러를 띄울 수 있습니다.

// aa.h
int add(int a, int b);
//bb.h
include "aa.h"

int remove(int a, int b);
//main.c or main.cpp
include "bb.h"
include "aa.h" // 2번 선언되는 경우

int main(){
	...
}

위의 코드에서 aa.h 이 두 번 include 되었음을 알 수 있습니다. bb.h 헤더파일에서 한 번 include 되었는데 main 코드에서 한번 더 include이 되었습니다. 이런 경우를 방지하기 위해서 2가지 방법이 있습니다.

 

#ifndef 사용

// aa.h
#ifndef AA_H
#define AA_H

int add(int a, int b);

#endif

#ifndef는 전처리기 코드로 AA_H가 정의(define)되어 있지 않으면, #endif가 나올 때까지 아래 코드를 수행하고, 정의되어 있으면, 실행하지 않는다고 보시면 됩니다. 말 그대로 if not define입니다.

 

//main.c or main.cpp
include "bb.h"
include "aa.h" // 추가되지 않음

int main(){
	...
}

따라서 #ifndef AA_H가 되어 있으면 main 코드에서는 "aa.h"가 적용되지 않을 것을 추측할 수 있습니다.

 

하지만 #ifndef는 중복을 피할 수 있지만, include 되어 있다면, 해당 헤더파일에 진입하여 #ifndef을 거쳐야 하므로 컴파일 속도가 조금 느릴 수 있습니다.

 

다만 장점으로는 기본적인 전처리기 코드임으로 컴파일러의 버전에 상관없이 컴파일이 된다는 것입니다.

 

#pragma once

// aa.h
#pragma once // 이 헤더 파일은 한번만 선언합니다.

int add(int a, int b);

#ifndef보다 조금 간단합니다. 이 전처리기 지시자를 작성해두면, 컴파일러는 이 헤더파일이 포함되어 있으면, 더 이상 중복으로 선언하지 않게 도와줍니다.

 

#pragma once는 간혹 오래된 컴파일러의 경우에 인식을 못할 수도 있지만, 엄청 오래된 것이기 때문에 크게 신경 안 써도 됩니다.