Namespaces
Variants

Source file inclusion

From cppreference.net

현재 소스 파일의 지시문 바로 다음 줄에 다른 소스 파일을 포함합니다.

목차

구문

#include < h-char-sequence > new-line (1)
#include " q-char-sequence " new-line (2)
#include pp-tokens new-line (3)
__has_include ( " q-char-sequence " )
__has_include ( < h-char-sequence > )
(4) (C23부터)
__has_include ( string-literal )
__has_include ( < h-pp-tokens > )
(5) (C23부터)
1) 고유하게 식별되는 h-char-sequence 헤더를 검색하고 지시문을 해당 헤더의 전체 내용으로 대체합니다.
2) q-char-sequence 로 식별된 소스 파일을 검색하고 지시문을 해당 소스 파일 전체 내용으로 대체합니다. 폴백(fallback)하여 (1) 와 같이 동작하며 q-char-sequence 를 헤더 식별자로 취급할 수 있습니다.
3) 만약 (1) (2) 도 매칭되지 않으면, pp-tokens 는 매크로 치환을 거칩니다. 치환 후의 지시문은 (1) 또는 (2) 와 다시 매칭을 시도합니다.
4) 헤더 또는 소스 파일이 포함 가능한지 여부를 확인합니다.
5) 만약 (4) 가 매치되지 않으면, h-pp-tokens 가 매크로 치환을 거칩니다. 치환 후의 지시문은 (4) 와 다시 매치를 시도합니다.
new-line - 개행 문자
h-char-sequence - 하나 이상의 h-char 시퀀스로, 다음 중 어느 하나가 나타나면 미정의 동작을 유발함:
  • 문자 '
  • 문자 "
  • 문자 \
  • 문자 시퀀스 //
  • 문자 시퀀스 /*
h-char - 소스 문자 집합 의 구성원 중 개행 문자와 > 를 제외한 모든 문자
q-char-sequence - 하나 이상의 q-char 시퀀스로, 다음 중 어느 하나가 나타나면 미정의 동작을 유발함:
  • 문자 '
  • 문자 \
  • 문자 시퀀스 //
  • 문자 시퀀스 /*
q-char - 소스 문자 집합 의 구성원 중 개행 문자와 " 를 제외한 모든 문자
pp-tokens - 하나 이상의 전처리 토큰 시퀀스
string-literal - 문자열 리터럴
h-pp-tokens - 전처리 토큰 > 를 제외한 하나 이상의 시퀀스

설명

1) h-char-sequence 로 식별되는 파일을 구현체 정의 방식으로 검색합니다. 이 구문의 의도는 구현체의 제어 하에 있는 파일을 검색하는 것입니다. 일반적인 구현에서는 표준 포함 디렉터리만 검색합니다. 표준 C 라이브러리는 이러한 표준 포함 디렉터리에 암묵적으로 포함됩니다. 표준 포함 디렉터리는 일반적으로 사용자가 컴파일러 옵션을 통해 제어할 수 있습니다.
2) q-char-sequence 로 식별된 파일을 구현체 정의 방식으로 검색합니다. 이 구문의 의도는 구현체에 의해 제어되지 않는 파일들을 검색하기 위한 것입니다. 일반적인 구현체들은 현재 파일이 위치한 디렉토리를 먼저 검색하고, 파일을 찾지 못한 경우에만 (1) 과 같이 표준 포함 디렉토리를 검색합니다.
3) 지시문에서 include 이후의 전처리 토큰들은 일반 텍스트에서와 동일하게 처리됩니다(즉, 현재 매크로 이름으로 정의된 각 식별자는 해당 전처리 토큰들의 대체 목록으로 교체됩니다). 모든 대체 후 생성되는 지시문은 앞서 설명한 두 가지 형식 중 하나와 일치해야 합니다. < > 전처리 토큰 쌍 사이의 전처리 토큰 시퀀스 또는 한 쌍의 " 문자 사이의 시퀀스가 단일 헤더 이름 전처리 토큰으로 결합되는 방법은 구현에 따라 정의됩니다.
4) h-char-sequence 또는 q-char-sequence 로 식별된 헤더 또는 소스 파일은 해당 전처리 토큰 시퀀스가 구문 (3) pp-tokens 인 것처럼 검색되며, 추가 매크로 확장은 수행되지 않습니다. 이러한 지시문이 #include 지시문의 구문 요구사항을 충족하지 않을 경우 프로그램은 잘못된 형식입니다. __has_include 표현식은 소스 파일 검색이 성공하면 1 로 평가되고, 검색이 실패하면 0 로 평가됩니다.
5) 이 형식은 구문 (4) 가 일치하지 않는 경우에만 고려되며, 이 경우 전처리 토큰은 일반 텍스트에서와 동일하게 처리됩니다.

파일을 찾을 수 없는 경우, 프로그램은 형식이 잘못되었습니다.

__has_include #if #elif 의 표현식 내에서 확장될 수 있습니다. #ifdef , #ifndef , #elifdef , #elifndef defined 에 의해 정의된 매크로로 취급되지만 다른 곳에서는 사용할 수 없습니다.

(C23부터)

참고 사항

일반적인 구현에서는 구문 (1)에 대해 표준 포함 디렉토리만 검색합니다. 표준 C 라이브러리는 이러한 표준 포함 디렉토리에 암묵적으로 포함됩니다. 표준 포함 디렉토리는 일반적으로 사용자가 컴파일러 옵션을 통해 제어할 수 있습니다.

구문 (2) 의 의도는 구현에 의해 제어되지 않는 파일들을 검색하는 것입니다. 일반적인 구현들은 현재 파일이 위치한 디렉토리를 먼저 검색한 후 (1) 으로 폴백(fallback)합니다.

파일이 포함될 때, 그것은 번역 단계 1-4에 의해 처리되며, 여기에는 구현체 정의 중첩 한계까지 재귀적으로 중첩된 #include 지시문의 확장이 포함될 수 있습니다. 동일한 파일의 반복적 포함과 파일이 자신을 (아마도 전이적으로) 포함할 때의 무한 재귀를 방지하기 위해, 헤더 가드 가 일반적으로 사용됩니다: 전체 헤더는 다음과 같이 감싸집니다

#ifndef FOO_H_INCLUDED /* 파일 이름에 고유하게 매핑된 임의의 이름 */
#define FOO_H_INCLUDED
// 파일 내용이 여기에 위치합니다
#endif

많은 컴파일러는 비표준 pragma #pragma once 도 유사한 효과로 구현합니다: 동일한 파일(파일 식별은 OS별 방식으로 결정됨)이 이미 포함된 경우 파일 처리를 비활성화합니다.

__has_include 의 결과가 1 인 것은 지정된 이름을 가진 헤더나 소스 파일이 존재한다는 의미만을 가집니다. 이는 해당 헤더나 소스 파일이 포함될 때 오류를 발생시키지 않거나 유용한 내용을 포함할 것임을 보장하지 않습니다.

예제

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 6.4.7 헤더 이름 (p: 69)
  • 6.10.1 조건부 포함 (p: 165-169)
  • 6.10.2 소스 파일 포함 (p: 169-170)
  • C17 표준 (ISO/IEC 9899:2018):
  • 6.10.2 소스 파일 포함 (p: 119-120)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.10.2 소스 파일 포함 (p: 164-166)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.10.2 소스 파일 포함 (p: 149-151)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.8.2 소스 파일 포함

참고 항목

C 표준 라이브러리 헤더 파일 목록
C++ 문서 for Source file inclusion