#include 와 #include "파일 이름"의 차이점은 무엇입니까?


질문

 

C 및 C ++ 프로그래밍 언어에서는 앵글 브래킷과 include 문에서 따옴표를 사용하는 것의 차이점은 다음과 같이 무엇입니까?

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

답변

 

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

#Include 의 경우 전처리자는 일반적으로 컴파일러 / IDE가 미리 지정된 검색 디렉토리에서 일반적으로 구현 종속 방식으로 검색합니다.이 메소드는 일반적으로 표준 라이브러리 헤더 파일을 포함하는 데 사용됩니다.

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

검색 경로에서 GCC 문서에서보다 완전한 설명을 사용할 수 있습니다.



답변

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

C 표준에서 6.10.2 절. 2 ~ 4 주 :

양식의 전처리 지시문 #include new-line 지정된 시퀀스가 ​​<및> 구분 기호간에 지정된 시퀀스로 고유하게 식별 된 헤더의 경우 구현 정의 된 위치를 검색하고 해당 지시문을 헤더의 전체 내용으로 대체합니다. 위치가 지정되었거나 식별 된 헤더가 구현 된 방법이 정의되어있는 방법입니다. 양식의 전처리 지시문 # "q-char-sequence"new-line "구분 기호 사이의 지정된 순서로 식별 된 소스 파일의 전체 내용으로 해당 지시문을 교체합니다. 명명 된 소스 파일은 구현 정의 방식으로 검색됩니다.이 검색이 지원되지 않거나 검색이 실패하면 이 지시문은 그것이 읽은 것처럼 재 처리됩니다 #include new-line 동일한 포함 된 시퀀스 (있는 경우> 문자가 포함 된 경우)로 원래의 경우 지령. 양식의 전처리 지시문 #include pp-tokens new-line. (이전의 두 가지 양식 중 하나와 일치하지 않는 경우). 지시문에 포함 된 전처리 토큰은 일반 텍스트 에서처럼 처리됩니다. (현재 매크로 이름으로 정의 된 각 식별자는 전처리 토큰의 대체 목록으로 대체됩니다.) 모든 대체품이 두 가지 이전 양식 중 하나와 일치하는 지침. 전처리 토큰 쌍 또는 "문자 쌍이"한 쌍의 "문자가 하나의 헤더 이름 전처리 토큰 사이의 전처리 토큰의 시퀀스가 ​​구현 된 것으로 정의되는 방법. 정의 : H-CHAR : 새 라인 캐릭터를 제외한 소스 캐릭터 세트의 모든 구성원 및> Q-CHAR : 새 라인 문자를 제외한 소스 문자 집합의 모든 구성원과 "



답변

는 반드시 파일이 아닌 헤더를 독특하게 참조하는 문자 순서입니다.구현은 원하는대로 문자 시퀀스를 사용할 수 없습니다.(그러나 주로 파일 이름으로 대우하고 포함 경로에서 검색을 수행하십시오. 다른 게시물로.)

#include "파일"양식을 사용하는 경우 구현은 지원되는 경우 지정된 이름의 파일을 먼저 찾습니다.(지원되지 않음) 또는 검색이 실패하면 구현은 다른 (#include ) 양식이 사용되는 것처럼 작동합니다.

또한, 세 번째 양식이 존재하며 #Include 지시문이 위의 양식 중 하나와 일치하지 않을 때 사용됩니다.이 양식에서는 몇 가지 기본 전처리 (예 : 매크로 확장과 같은)가 #Include 지시문의 "피연산자"에서 수행되며 결과는 두 가지 형식 중 하나와 일치 할 것으로 예상됩니다.



답변

여기서는 여기에 C19 (예 : C 컴파일러) 명령의 특정 동작, 특히 POSIX 표준, 특히 POSIX 표준을 잊어 버렸습니다.

열린 그룹 기본 사양 문제 7에 따르면,

-i 디렉토리 일반적인 장소를보고 전에 디렉토리 경로 이름이 명명 된 디렉토리를 살펴보기 위해 이름이 절대 경로 이름이 아닌 헤더를 검색하는 알고리즘을 변경하십시오.따라서 이름이 더 큰 따옴표 ( "")로 묶인 헤더를 #Include 행이있는 파일 디렉토리에서 먼저 먼저 검색 한 다음 -i 옵션에 명명 된 디렉토리에서 일반적인 장소에서 마지막으로 검색됩니다.이름이 꺾쇠 괄호 ( "<>")로 묶인 헤더의 경우 헤더는 -i 옵션에있는 디렉토리에서만 검색 한 다음 일반적인 장소에서만 검색됩니다.-i 옵션에서 이름을 지정한 디렉토리는 지정된 순서대로 검색되어야한다.구현은 단일 C99 명령 호출 에서이 옵션의 10 개 이상의 인스턴스를 지원해야합니다.

따라서 POSIX 호환 환경에서 POSIX 호환 C 컴파일러가있는 #include "file.h"는 ./file.h 첫 번째를 검색 할 것입니다.#include 가 /usr/include/file.h를 검색 할 수있는 동안 #include 문이있는 파일이있는 디렉토리는 / usr / include가 시스템이 일반적인 장소를 정의 할 것입니다.헤더 (POSIX로 정의되지 않은 것 같습니다).



답변

전처리 자의 정확한 동작은 컴파일러간에 다릅니다.다음 답변은 GCC 및 기타 여러 컴파일러에 적용됩니다.

#Include 는 컴파일러에 "포함"디렉토리에서 헤더를 검색하도록 알려줍니다.mingw의 경우 컴파일러는 c : \ mingw \ include \ 또는 컴파일러가 설치된 곳에서 file.h를 검색합니다.

#include "파일"은 컴파일러에 현재 디렉토리를 검색하도록 알려줍니다 (즉, 소스 파일이있는 디렉토리) 파일에 대해 알려줍니다.

GCC의 경우 -i 플래그를 사용하여 각도 괄호가 포함 된 괄호가 포함되어 있으면 -I 이후 디렉토리의 헤더를 검색해야합니다.GCC는 플래그가 포함 된 것처럼 디렉토리가 포함 된 것처럼 디렉토리를 처리합니다.

예를 들어, 자신의 디렉토리에서 myheader.h라는 파일이있는 경우 #include flag -i로 gcc를 호출 한 경우 를 말할 수 있습니다.(현재 디렉토리에서 포함 검색을 검색해야 함을 나타냅니다.)

-i 플래그가 없으면 # include "myheader.h"를 사용하여 파일을 포함 시키거나 myHeader.h를 컴파일러의 포함 디렉토리로 이동해야합니다.



답변

GCC 문서는 두 가지 간의 차이점에 대해 다음과 같습니다.

사용자 및 시스템 헤더 파일 모두 전처리 지시문 '#include'를 사용하여 포함됩니다. 두 가지 변형이 있습니다. #include 이 변형은 시스템 헤더 파일에 사용됩니다. 시스템 디렉토리의 표준 목록에서 파일 이름이 지정된 파일을 검색합니다. -i 옵션 (호출 참조)을 사용 하여이 목록에 디렉토리를 추가 할 수 있습니다. #include "파일" 이 변형은 자신의 프로그램의 헤더 파일에 사용됩니다. 현재 파일이 포함 된 디렉토리의 파일 이름이 먼저 파일을 검색 한 다음 Quote 디렉토리에서 에 사용되는 것과 동일한 디렉토리를 검색합니다. -iquote 옵션을 사용하여 디렉토리를 인용 디렉토리 목록에 추가 할 수 있습니다. 견적 마크 또는 각도 괄호로 구분 된 '#include'의 인수는 해당 주석이 인식되지 않고 매크로 이름이 확장되지 않도록 지속적으로 작동합니다. 따라서 #include 는 x / * y라는 시스템 헤더 파일의 포함을 지정합니다. 그러나 파일 내에서 백 슬래시가 발생하면 일반 텍스트 문자로 간주되며 문자를 이스케이프하지 않습니다. C의 문자열 상수에 적합한 문자 이스케이프 시퀀스는 처리되지 않습니다. 따라서 # include "x \ n \\ y"는 3 개의 백 슬래시를 포함하는 파일 이름을 지정합니다. (일부 시스템은 PathName 구분 기호로 '\'해석을 해석합니다.이 모든 것들은 또한 '/'해석 '/'을 해석합니다. '/'만 사용하는 것이 가장 이식 가능합니다.) 파일 이름 뒤에 줄에있는 것이 있으면 오류가 발생합니다.

출처:https://stackoverflow.com/questions/21593/what-is-the-difference-between-include-filename-and-include-filename