C/C++ 프로그래밍에서 #include <filename>과 #include "filename"의 차이점

2024-07-27

C/C++ 프로그래밍에서 #include <filename>과 #include "filename"의 차이점

#include <filename>

  • 각 컴파일러마다 정의된 표준 헤더 파일을 포함하는 데 사용됩니다.
  • <filename> 안에 작성된 파일 이름은 컴파일러가 미리 정의된 경로 목록에서 검색됩니다. 이 목록은 일반적으로 운영 체제 및 컴파일러에 따라 다릅니다.
  • 예를 들어, #include <iostream>은 대부분의 시스템에서 iostream.h 헤더 파일을 포함합니다.
  • 사용자가 정의한 헤더 파일 또는 현재 소스 코드 파일과 같은 위치에 있는 헤더 파일을 포함하는 데 사용됩니다.
  • "filename" 안에 작성된 파일 이름은 현재 소스 코드 파일이 있는 디렉토리부터 검색이 시작됩니다.
  • 해당 디렉토리에서 파일을 찾지 못하면 컴파일러는 에러를 발생시킵니다.
  • 예를 들어, #include "myheader.h"는 현재 소스 코드 파일과 같은 디렉토리에 있는 myheader.h 헤더 파일을 포함합니다.

사용 시 주의 사항

  • 표준 헤더 파일을 포함할 때는 항상 #include <filename> 형식을 사용해야 합니다.
  • 사용자 정의 헤더 파일을 포함할 때는 #include "filename" 또는 #include <filename> 형식을 사용할 수 있습니다. 하지만 일반적으로 #include "filename" 형식을 사용하는 것이 좋습니다.
  • 이는 현재 소스 코드 파일과 동일한 위치에 있는 헤더 파일에 대한 접근성을 향상시키고, 다른 프로젝트에서 동일한 이름의 헤더 파일과의 충돌 가능성을 줄이기 때문입니다.

예시

// #include <iostream> 을 사용하여 표준 헤더 파일 iostream을 포함합니다.
#include <iostream>

// #include "myheader.h" 을 사용하여 사용자 정의 헤더 파일 myheader.h를 포함합니다.
#include "myheader.h"

int main() {
  // iostream 헤더 파일에서 정의된 std::cout 객체를 사용하여 문자열을 출력합니다.
  std::cout << "Hello, world!" << std::endl;

  // myheader.h 헤더 파일에서 정의된 myFunction() 함수를 호출합니다.
  myFunction();

  return 0;
}



// #include <iostream> 을 사용하여 표준 헤더 파일 iostream을 포함합니다.
#include <iostream>

// #include "myheader.h" 을 사용하여 사용자 정의 헤더 파일 myheader.h를 포함합니다.
#include "myheader.h"

int main() {
  // iostream 헤더 파일에서 정의된 std::cout 객체를 사용하여 문자열을 출력합니다.
  std::cout << "Hello, world!" << std::endl;

  // myheader.h 헤더 파일에서 정의된 myFunction() 함수를 호출합니다.
  myFunction();

  return 0;
}
  1. #include <iostream> 지시문은 표준 헤더 파일 iostream을 포함합니다. 이 헤더 파일은 입력 및 출력 스트림을 위한 함수와 정의를 제공합니다.
  2. #include "myheader.h" 지시문은 사용자 정의 헤더 파일 myheader.h를 포함합니다. 이 헤더 파일은 사용자가 정의한 함수와 변수를 선언할 수 있습니다.
  3. main() 함수는 프로그램의 진입점입니다. 모든 C/C++ 프로그램은 main() 함수를 가져야 합니다.
  4. std::cout << "Hello, world!" << std::endl; 문자열은 "Hello, world!"를 콘솔에 출력합니다.
  5. myFunction(); 문자열은 myheader.h 헤더 파일에서 정의된 myFunction() 함수를 호출합니다.



많은 C++ 프레임워크와 라이브러리는 헤더 파일을 직접 포함하는 대신 간접적으로 포함하는 방식을 제공합니다. 예를 들어, Boost 라이브러리는 헤더 파일 대신 헤더 파일 모듈을 사용합니다. 헤더 파일 모듈은 여러 헤더 파일을 하나의 모듈로 묶어 관리하기 쉽도록 합니다. 또한, CMake와 같은 빌드 시스템은 프로젝트의 종속성을 자동으로 관리하고 필요한 헤더 파일을 포함하는 데 도움을 줄 수 있습니다.

장점:

  • 코드 정리 및 관리 용이성 향상
  • 헤더 파일 누락 오류 감소
  • 빌드 시스템과의 통합 용이

단점:

  • 추가적인 프레임워크 또는 라이브러리에 대한 의존도 증가
  • 복잡성 증가

전처리기 매크로 사용

헤더 파일 내용을 직접 코드에 복사하는 대신 전처리기 매크로를 사용하여 헤더 파일의 기능을 대체할 수 있습니다. 예를 들어, 다음과 같은 매크로를 사용하여 iostream 헤더 파일의 기능을 대체할 수 있습니다.

#define CIN std::cin
#define COUT std::cout
#define ENDL std::endl

// ...

CIN >> variable;
COUT << variable << ENDL;
  • 헤더 파일 포함 없이 코드 간결성 향상
  • 특정 상황에 맞는 헤더 파일 내용 수정 가능
  • 코드 가독성 저하
  • 유지 관리 어려움
  • 헤더 파일 내용 변경 시 코드 수정 필요

모듈 사용

C++20에서는 모듈 시스템을 도입하여 헤더 파일을 포함하는 새로운 방법을 제공합니다. 모듈은 헤더 파일, 소스 코드 및 기타 리소스를 하나의 단위로 묶는 방법입니다. 모듈을 사용하면 다음과 같은 이점이 있습니다.

  • 컴파일 속도 향상
  • 코드 의존성 명확화
  • 헤더 파일 관리 개선
  • C++20 이상의 컴파일러 필요
  • 일부 IDE 및 빌드 시스템에서 아직 완벽하게 지원되지 않음

c++ c include

c++ c include