#include <filename>과 #include“filename”의 차이점은 무엇입니까? 같이 명령문 에서 꺾쇠 괄호 사용과

C 및 C ++ 프로그래밍 언어에서 include다음과 같이 명령문 에서 꺾쇠 괄호 사용과 따옴표 사용의 차이점은 무엇 입니까?

  1. #include <filename>
  2. #include "filename"


답변

실제로, 전처리 기가 포함 된 파일을 검색하는 위치에 차이가 있습니다.

들면 #include <filename>통상 검색 디렉토리 구현 의존적으로 전처리 검색 컴파일러 / IDE에 의해 지정 사전. 이 방법은 일반적으로 표준 라이브러리 헤더 파일을 포함하는 데 사용됩니다.

#include "filename"전 처리기의 경우 , 지시문이 포함 된 파일과 동일한 디렉토리에서 먼저 검색 한 다음 #include <filename>양식에 사용 된 검색 경로를 따릅니다 . 이 방법은 일반적으로 프로그래머 정의 헤더 파일을 포함하는 데 사용됩니다.

보다 자세한 설명은 검색 경로 에 대한 GCC 설명서를 참조하십시오 .


답변

알 수있는 유일한 방법은 구현 문서를 읽는 것입니다.

에서는 C 표준 , 섹션 6.10.2, 2~4 주 문단 :

  • 양식의 전처리 지시문

    #include <h-char-sequence> new-line

    와 구분 기호 사이의 지정된 순서로 고유하게 식별 된 헤더에 대해 일련의 구현 정의 된 위치를 검색하고 해당 지시문을 헤더 의 전체 컨텐츠로 대체합니다 . 장소가 지정되거나 헤더가 식별되는 방식은 구현에 따라 다릅니다.<>

  • 양식의 전처리 지시문

    #include "q-char-sequence" new-line

    구분 기호 사이의 지정된 순서로 식별 된 소스 파일 의 전체 내용으로 해당 지시문을 대체 합니다 ". 명명 된 소스 파일 은 구현 정의 방식으로 검색됩니다. 이 검색이 지원되지 않거나 검색이 실패하면 지시문은 읽은 것처럼 재 처리됩니다.

    #include <h-char-sequence> new-line

    >원래 지시문 의 동일한 포함 시퀀스 (있는 경우 문자 포함 )

  • 양식의 전처리 지시문

    #include pp-tokens new-line

    (이전의 두 형식 중 하나와 일치하지 않음)이 허용됩니다. include지시문에서 이후의 전처리 토큰 은 일반 텍스트에서와 같이 처리됩니다. (현재 매크로 이름으로 정의 된 각 식별자는 전처리 토큰의 교체 목록으로 대체됩니다.) 모든 교체 후 생성 된 지시문은 이전 두 양식 중 하나와 일치해야합니다. a <>전처리 토큰 쌍 또는 한 쌍의 "문자 사이의 일련의 전처리 토큰 이 단일 헤더 이름 전처리 토큰으로 결합되는 방법은 구현 정의됩니다.

정의 :

  • h-char : 개행 문자를 제외한 소스 문자 세트의 모든 멤버 >

  • q-char : 개행 문자를 제외한 소스 문자 세트의 모든 멤버 "


답변

<와> 사이의 문자 시퀀스는 헤더 일 뿐이며 반드시 파일 일 필요는 없습니다. 구현은 원하는대로 문자 시퀀스를 자유롭게 사용할 수 있습니다. (대부분 파일 이름으로 취급 하고 다른 게시물 상태와 같이 include 경로 에서 검색하면 됩니다 .)

경우 #include "file"양식, 지정된 이름의 파일에 대해, 구현 최초의 외모를 사용하는 지원합니다. 지원되지 않거나 검색이 실패하면 구현은 다른 #include <file>양식 ( )이 사용 된 것처럼 작동 합니다.

또한 세 번째 양식이 존재하며 #include지시문이 위의 양식 중 하나와 일치하지 않을 때 사용됩니다 . 이 형식에서는 매크로 확장과 같은 일부 기본 전처리가 #include지시문 의 “피연산자”에서 수행되며 결과는 다른 두 가지 형식 중 하나와 일치합니다.


답변

여기서 좋은 대답은 C 표준을 참조하지만 POSIX 표준, 특히 c99 (예 : C 컴파일러) 명령 의 특정 동작을 잊어 버렸습니다 .

공개 그룹 기본 사양 문제 7 에 따르면 ,

-I 디렉토리

일반적인 위치를 찾기 전에 디렉토리 경로 이름으로 이름이 지정된 디렉토리를 찾도록 이름이 절대 경로 이름이 아닌 헤더를 검색하는 알고리즘을 변경하십시오 . 따라서 이름이 큰 따옴표 ( “”)로 묶인 헤더는 먼저 #include 행 을 사용하여 파일의 디렉토리에서 검색 한 다음 -I 옵션으로 이름이 지정된 디렉토리 에서 검색하고 일반적인 위치에서 마지막으로 검색해야합니다. 이름이 꺾쇠 괄호 ( “<>”)로 묶인 헤더의 경우 헤더는 -I 옵션으로 이름 지정된 디렉토리에서만 검색 한 다음 일반적인 위치에서 검색해야합니다 . -I 옵션으로 명명 된 디렉토리 는 지정된 순서대로 검색됩니다.c99 명령 호출

그래서, POSIX와 호환되는 C 컴파일러와 POSIX 호환 환경에서, #include "file.h"가능성을 검색 할 것입니다 ./file.h첫째, 어디 .와 파일 디렉토리입니다 #include문을하면서 #include <file.h>, 가능성을 검색 할 것입니다 /usr/include/file.h첫째, 어디 /usr/include시스템 정의 헤더의 일반적인 장소 (POSIX에 의해 정의되지 않은 것 같습니다).


답변

GCC 문서는 이 둘의 차이점에 대해 다음과 같이 말합니다 .

사용자 및 시스템 헤더 파일 모두 사전 처리 지시문을 사용하여 포함됩니다 ‘#include’. 두 가지 변형이 있습니다.

#include <file>

이 변형은 시스템 헤더 파일에 사용됩니다. 표준 시스템 디렉토리 목록에서 file이라는 파일을 검색합니다. -I옵션을 사용하여 디렉토리를이 목록 앞에 추가 할 수 있습니다 ( 호출 참조 ).

#include "file"

이 변형은 자신의 프로그램의 헤더 파일에 사용됩니다. 현재 파일이 들어있는 디렉토리에서 먼저 file이라는 파일을 찾은 다음 quote 디렉토리에서에 사용 된 것과 동일한 디렉토리를 검색 <file>합니다. -iquote옵션을 사용하여 디렉토리를 인용 디렉토리 목록 앞에 추가 할 수 있습니다 . ‘#include’따옴표 나 꺾쇠 괄호로 구분 되든 의 인수는 주석이 인식되지 않고 매크로 이름이 확장되지 않는다는 점에서 문자열 상수처럼 동작합니다. 따라서 #include <x/*y>라는 시스템 헤더 파일을 포함하도록 지정합니다 x/*y.

그러나 파일 내에서 백 슬래시가 발생하면 이스케이프 문자가 아닌 일반 텍스트 문자로 간주됩니다. C의 문자열 상수에 적합한 문자 이스케이프 시퀀스는 처리되지 않습니다. 따라서 #include "x\n\\y"세 개의 백 슬래시가 포함 된 파일 이름을 지정합니다. (일부 시스템에서는 ‘\’를 경로 이름 구분 기호로 해석 ‘/’합니다. 이들 모두도 같은 방식으로 해석 됩니다 ‘/’.

파일 이름 다음 줄에 주석 이외의 것이 있으면 오류가 발생합니다.


답변

그렇습니다:

"mypath/myfile" is short for ./mypath/myfile

.이 파일의 디렉토리 중 하나 인 #include에 포함되어, 및 / 또는 컴파일러의 현재 작업 디렉토리 및 / 또는default_include_paths

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

경우 ./<default_include_paths>, 그것은 차이를 만들지 않습니다.

mypath/myfile다른 포함 디렉토리에 있으면 동작이 정의되지 않습니다.


답변

(가) <file>포함은에서 검색하는 전처리를 알려줍니다 -I디렉토리와 미리 정의 된 디렉토리에 처음 .c 파일의 디렉토리에 다음. (가) "file"포함 소스 파일의 디렉토리를 검색 할 수 처리기를 알려줍니다 첫째 , 다음으로 되돌아 -I와 미리 정의. 어쨌든 모든 대상이 검색되며 검색 순서 만 다릅니다.

2011 표준은 주로 “16.2 소스 파일 포함”의 포함 파일에 대해 설명합니다.

2 양식의 전처리 지시문

# include <h-char-sequence> new-line

<및> 구분 기호 사이의 지정된 시퀀스로 고유하게 식별 된 헤더에 대한 구현 정의 된 장소 시퀀스를 검색하고 해당 지시문을 헤더의 전체 컨텐츠로 대체합니다. 장소가 지정되거나 헤더가 식별되는 방식은 구현에 따라 다릅니다.

3 양식의 전처리 지시문

# include "q-char-sequence" new-line

“구분자 사이에서 지정된 순서로 식별 된 소스 파일의 전체 내용으로 해당 지시문을 대체합니다. 명명 된 소스 파일은 구현 정의 방식으로 검색됩니다.이 검색이 지원되지 않거나 검색이 실패한 경우 지시문은 마치 읽은 것처럼 재 처리됩니다.

# include <h-char-sequence> new-line

원래 지시문의 동일한 포함 시퀀스 (> 문자가있는 경우 포함)

그 주 "xxx"에 양식이 저하 <xxx>파일을 찾을 수없는 경우 양식을. 나머지는 구현 정의입니다.