C++ / / 2024. 12. 28.

[C++] #include<>와 #include ""의 차이점

반응형

파일을 포함하는 #include 전처리기 지시자

#include 전처리기 지시자( preprocessor directive )가 하는 일은, 이 지시자 뒤에 위치하는 파일의 코드들을, 이 지시자가 사용된 파일에 포함하는 것입니다.

여기서 필요한 것은, 포함하고자 하는 파일의 이름과, 이 파일을 찾기 위한 기준 검색 위치입니다.

 

만약, 포함하고자 하는 파일의 위치를, #include 지시자가 사용된 파일의 위치를 기준으로 검색하고 싶다면 큰 따옴표( " " )를 사용해야 합니다.

 

다음 예문이 이러한 방법을 보여줍니다.

// struct_type.h ----------------------------------------
#ifndef STRUCT_TYPE_H   // 헤더 가드
#define STRUCT_TYPE_H

struct myPoint{
    int x;
    int y;
};

void move_point( myPoint& pt, int move);  // 전방 선언

#endif

// struct_type.cpp -------------------------------------
#include "struct_type.h"

void move_point( myPoint& pt, int move){    // 함수의 정의
    pt.x += move;
    pt.y += move;
}

위의 #include 코드를 전처리기( preprocessor )가 만나게 되면, "struct_type.h"를 포함하기 위해서 "struct_type.cpp" 파일이 위치한 폴더를 최우선으로 검색하게 됩니다.

 

만약, "struct_type.h" 파일을 "struct_type.cpp" 파일이 위치한 경로에서 찾을 수 없으면, 전처리기는 포함 디렉터리( include directories )로 설정되어 있는 파일 경로들을 검색하게 됩니다.

이러한 포함 디렉터리에는 각 컴파일러와 IDE( Integrated Development Environment )의 프로젝트 설정에 지정되어 있는 디렉터리들과 시스템의 경로( path ) 환경 변수에 등록되어 있는 디렉터리 등이 포함됩니다.

 

이와 달리, 포함하고자 하는 파일을 위에서 설명한 포함 디렉터리( include directories )를 기준으로 검색하고 싶은 경우도 있습니다.

예를 들면, C++ 표준 라이브러리의 헤더 파일을 포함하거나 외부 라이브러리 파일을 사용하고 싶을 때입니다.

이 경우 사용하는 것이 홑화살괄호( angled brakets <> )입니다.

// main.cpp
#include <iostream>

int main(){
    std::cout << "Hello! world.\n";
}

이 경우, iostream 파일이 "main.cpp" 파일과 같은 폴더에 있더라도, C++표준 라이브러리가 설치되어 있는 폴더를 먼저 검색하게 될 것입니다.

 

#include <iostream>

위에서 #include 지시자에 <>를 사용하여 헤더 파일 이름을 지정하면, 지정된 포함 디렉터리( include directories )에서 이에 해당하는 헤더 파일을 검색한다고 했었습니다.

그런데, #include <iostream> 문장에선 헤더 파일 명을 iostream.h라고 하지 않고, iostream으로 적는 걸까요?

 

그 이유는, 실제 헤더 파일 이름이 iostream이기 때문입니다.

그리 오래 걸리지 않으니까, 정말 그러한지 컴파일러가 설치된 곳을 한번 찾아보길 추천합니다.

 

그리고, 이와 비슷하게 #include <math.h> 문장을 사용하기도 하고, #include <cmath> 문장을 섞어 쓰는 것을 보게 되기도 합니다.

이때 사용된 cmath 헤더 파일의 이름도 cmath.h가 아니라 cmath입니다.

 

왜, C++ 표준 라이브러리는 이러한 파일명에, 헤더 파일의 오래된 관습을 따른 확장자 ". h"를 사용하지 않는 걸까요?

 

그것은, C++ 표준 라이브러리가 자신의 모든 식별자를 std 네임 스페이스( namespace )에 옮기는 대수술을 거쳤기 때문입니다.

 

이러한 대수술은 표준 라이브러리의 식별자를 다른 사용자 식별자( user identifier )나 외부 라이브러리 식별자와 안전한 구분 방법을 만들어 주었지만, 후유증을 남기기도 했습니다.

 

그것은 기존의 std 네임 스페이스가 생기기 전에 작성되었던 코드들의 호환성 문제입니다.

그래서, C++에서는 기존 코드들을 위한 기존의 헤더 파일엔 확장자 ". h"를 이전과 같이 사용하고, 새로운 라이브러리의 헤더 파일엔 확장자를 사용하지 않도록 하게 된 것입니다.

 

그리고, 기존의 math.h 헤더 같은 C 언어와 호환되는 파일은, 새롭게 변경되었음을 나타내기 위해 확장자를 사용하지 않는 것뿐만 아니라, 기존의 파일 명에 c를 붙여 cmath와 같이 명명하게 되었습니다.

 

 

정리

  • 사용자 코드 파일과 같은 위치의 헤더 파일을 사용하고 싶다면 #include 지시자에 큰 따옴표( " " )를 사용해야 합니다.
  • C++ 표준 라이브러리의 헤더 파일이나 외부 라이브러리의 헤더 파일을 사용하고 싶다면 #include < >를 사용합니다.

 

 

이 글과 관련 있는 글들

 

 

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유