[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는 간혹 오래된 컴파일러의 경우에 인식을 못할 수도 있지만, 엄청 오래된 것이기 때문에 크게 신경 안 써도 됩니다.
'개발 > C와 C++' 카테고리의 다른 글
[c/c++] PSTR(), F() 플래시 메모리에 값 저장 (0) | 2022.10.30 |
---|---|
[C/C++] -> 화살표 연산자와 . 도트(멤버) 연산자 차이점과 사용 (0) | 2022.09.03 |
[C/C++ Error] switch quantity not an integer (0) | 2022.09.01 |
[C/C++] 메모리 할당(malloc, calloc, realoc, free) (0) | 2022.08.22 |