1922

C 및 C ++ 프로그래밍 언어에서 꺽쇠 괄호를 사용하고 따옴표를 사용하는 것의 차이는 무엇입니까?include성명서?

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


30 답변


1118

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

에 대한#include <filename>선행 처리기는 일반적으로 컴파일러 / IDE에 의해 미리 지정된 검색 디렉토리에서 구현 방식에 따라 검색합니다. 이 방법은 일반적으로 표준 라이브러리 헤더 파일을 포함하는 데 사용됩니다.

에 대한#include "filename"선행 처리기는 지시문이 들어있는 파일과 동일한 디렉토리에서 먼저 검색 한 다음 해당 지시문이 들어있는 파일에 사용 된 검색 경로를 따릅니다.#include <filename>형태. 이 메소드는 일반적으로 프로그래머가 정의한 헤더 파일을 포함하는 데 사용됩니다.

GCC에서 더 자세한 설명을 볼 수 있습니다.검색 경로 문서.


  • 성명 : " 전처리 기가 동일한 디렉토리에서 검색합니다 " 실제로는 사실 일 수 있지만, 표준은 명명 된 소스 파일이 "구현 정의 된 방식으로 검색된다"라고 기술하고있다. piCookie의 답을 참조하십시오. - Richard Corden
  • 답은 "true"로 표시 될 수 있지만, 이는 많은 구현이 관습에 따라 작동하기 때문에 aib 및 piCookie의 답변을 면밀히 검토해야합니다. 이들은 둘 다 (실제 표준은 C 표준의 표현에 의해 뒷받침 됨) 실제 구분에는 "헤더" "소스 파일"을 포함하는 것에 비해, (그리고 아니요, 이것은 ".h"대 ".c"를 의미하지 않습니다). " 소스 파일 " 이 문맥에서 ".h"는 (그리고 대체로, 거의 항상 존재해야하며); 파일. 헤더는 반드시 파일 일 필요는 없습니다 (예 : 컴파일러가 파일이 아닌 정적으로 코딩 된 헤더를 포함 할 수 있음). - Dan Moulding
  • "... 전처리 기는 포함될 파일을 위해 컴파일되고있는 파일과 동일한 디렉토리에서 검색한다." 이 진술은 완전히 정확하지 않습니다. 나는이 질문에 관심이 있었기 때문에 나는 실제 답변이 무엇인지 궁금했기 때문에 이것이 사실이 아니라는 것을 안다. 왜냐하면 적어도 gcc에서 -include " filename으로 지정된 파일을 검색 할 추가 경로를 지정할 때 그렇기 때문이다. .h " - Gabriel Southern
  • 답변을 좋아하지 않는 사용자는 문제가있는 한 가지 실례를 들으십시오. - 0kcats
  • 물론, 같은 구문의 헤더를 포함 할 때 이러한 구문을 혼합했습니다. 라이브러리를 다시 정의하고 재정의 오류가 발생했습니다. 내가 올바르게 이해한다면,#include <...>시스템에 설치된 패키지를 사용하고#include "..."근처 저장소 버전을 사용했습니다. 나는 그것들을 거꾸로 가질지도 모른다. 어느 쪽이든, 패키지 헤더의 포함 가드에는 밑줄이 붙습니다. 버전 규정자가 나를 더 잘 이해할지라도 패키지를위한 협약 일 수도 있고 의도적으로 두 개를 혼합하는 것을 방지하는 방법 일 수도있다. - John P

619

알아야 할 유일한 방법은 구현 문서를 읽는 것입니다.

에서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와 b 사이의 사전 처리 토큰 시퀀스<>사전 처리 토큰 쌍 또는"문자는 단일 헤더 이름으로 결합됩니다. 사전 처리 토큰은 구현 정의입니다.

정의 :

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

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


  • 관련성 :g ++~에서비주얼 C ++ - Alexander Malakhov
  • @piCookie both < filename > 및 "파일명" 구현 정의 장소를 검색하십시오. 그래서 차이점은 무엇입니까? - onmyway133
  • @Stefan, INCLUDE_PATH에 대해 아무 말도하지 않는 표준을 인용하고 있습니다. 귀하의 구현은 그렇게 할 수 있으며, 그렇지 않을 수도 있습니다. 원래 질문은 일반적으로 C이며 gcc (INCLUDE_PATH를 사용한다고 생각하지 않음) 또는 Microsoft C (내가 생각하는 것) 또는 다른 어떤 것이기 때문에 일반적으로 대답 할 수는 없지만 각 구현의 문서를 참조해야합니다. - piCookie
  • 이러한 모든 상황에서와 마찬가지로 구체적인 예 (특히 일반적인 시나리오)는 매우 유용하며 동등하게 평가됩니다. 불필요하게 둔한 일반 응답은 실제로 사용하지 않아도됩니다. - vargonian
  • " C 표준을 자세히 설명하고 질문에 답변하지 않는 방법은 " - anatolyg

239

< 및>는 고유하게 파일을 가리키는 것은 아니라는 헤더를 참조합니다. 구현시 문자 시퀀스를 원하는만큼 자유롭게 사용할 수 있습니다. (대부분의 경우, 파일 이름으로 취급하고경로 포함, 다른 게시물 상태로.)

만약#include "file"form이 사용되면, 구현은 먼저 지원되는 경우 주어진 이름의 파일을 찾습니다. 지원되지 않는 (지원되는) 경우 또는 검색이 실패하면 구현은 다른 (#include <file>) 형태가 사용되었다.

또한 세 번째 형식이 존재하며#include지시문이 위 양식 중 하나와 일치하지 않습니다. 이 형식에서 매크로 사전 설정과 같은 일부 기본 사전 처리가#include지시문을 사용하면 결과가 다른 두 가지 형식 중 하나와 일치 할 것으로 예상됩니다.


  • +1, 여기가 아마도 가장 간결하고 정확한 대답 일 것입니다. 표준 (piCookie가 그의 대답에서 인용 한)에 따르면, 유일한레알차이는 "헤더"이다. 대 "소스 파일"이다. 검색 메커니즘은 어느쪽으로 든 구현 정의됩니다. 큰 따옴표를 사용하면 " 소스 파일 "을 포함하려는 반면 꺾쇠 괄호는 " 헤더 " 당신이 말한대로 파일이 아닐지도 모릅니다. - Dan Moulding
  • 답변을 얻으려면 Dan Molding의 코멘트를 참조하십시오. 표준 헤더는 파일 형식이 아니어야하며 내장형 일 수 있습니다. - aib
  • 이 "표준 헤더는 파일 형식이 아니어야합니다."라는 메시지를 읽었습니다. 10 년간 실제 사례를 제공하기위한주의? - Maxim Egorushkin
  • @Maxim Yegorushkin : 나는 실제 세계의 예를 생각할 수 없다. 그러나 헤더가 파일 일 필요가 없으면 MS-DOS 용으로 완전한 C11 컴파일러가 존재할 수 없습니다. 이는 C11 헤더 이름 중 일부가 "8.3"헤더와 호환되지 않기 때문입니다. MS-DOS 파일 이름 제한 - Dan Moulding
  • @MaximEgorushkin : VAX / VMS C 컴파일러는 모든 C 런타임 라이브러리 헤더를 단일 텍스트 라이브러리 파일 (유닉스 아카이브와 비슷 함)에 보관하고,<>도서관에 색인을 생성하는 열쇠입니다. - Adrian McCarthy

97

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

에 따르면오픈 그룹 기본 사양 문제 7,

-나는 예배 규칙서

이름이 절대 경로명이 아닌 헤더를 검색하기위한 알고리즘을 변경하여예배 규칙서일반적인 장소를보기 전에 경로명. 따라서 이름을 큰 따옴표 ( "")로 묶은 헤더는 먼저 파일의 디렉토리에서#포함다음에-나는옵션을 선택하고 일반적인 장소에서 마지막으로 사용합니다. 이름이 괄호 ( ">>")로 묶인 헤더의 경우 헤더는 in-나는옵션을 선택한 다음 일반적인 장소에서. 디렉토리 이름-나는옵션은 지정된 순서대로 검색되어야한다. 구현은이 옵션의 적어도 10 개의 인스턴스를 단일 인스턴스로 지원해야한다.c99명령 호출.

따라서 POSIX 호환 환경에서 POSIX 호환 C 컴파일러를 사용하면,#include "file.h"가능성이 높다../file.h첫째, 어디서.디렉토리는 파일이있는 곳입니다.#include성명서#include <file.h>, 가능성이 높습니다/usr/include/file.h첫째, 어디서/usr/include귀하의 시스템이 정의되어 있습니까?평소 장소헤더 (그것은 POSIX에 의해 정의되지 않은 것 같습니다).


  • 텍스트의 정확한 출처는 무엇입니까? IEEE Std 1003.1, 2013의 규범적인 부분인가요? - osgx
  • @osgx : 그 문언 (또는 매우 유사한 것)은 POSIX 스펙에서 찾을 수있다.c99- 이것은 C 컴파일러의 POSIX 이름입니다. (POSIX 2008 표준은 C11을 거의 참조하지 않을 수 있지만 POSIX 2008의 2013 업데이트는 C 표준을 변경하지 않았습니다.) - Jonathan Leffler

39

그렇습니다:

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

.파일의 디렉토리이거나#include컴파일러의 현재 작업 디렉토리 및 / 또는default_include_paths

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

만약./에있다<default_include_paths>, 그것은 차이를 만들지 않습니다.

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


  • 아니,#include "mypath/myfile"같지 않다.#include "./mypath/myfile". piCookie의 대답에 따르면, 큰 따옴표는 컴파일러에서 구현에 따라 정의 된 방식으로 검색하도록 지시합니다. 여기에는 지정된 위치에서 검색하는 것이 포함됩니다#include <...>. (실제로, 그것은 아마도 동일하지만, 예를 들어,/usr/include/mypath/myfile다음과 같이 지칭 될 수있다./usr/include/./mypath/myfile- 적어도 유닉스 계열 시스템에서는.) - Keith Thompson
  • @ Keith Thompson : 그렇습니다. 저는 제 리눅스 박스에 대해 생각하고있었습니다. 분명히 다를 수 있습니다. 실제로, 비 -POSIX 운영 체제 인 Windows는 /를 경로 분리 자로 해석하고 ./도 존재합니다. - Stefan Steiger
  • -L방향옵션이 추가됩니다.방향~로defaultincludepaths, 다른 의미를 부여하는 것과는.(위에서 언급 한 바와 같이). 이것은 예상되는 결과로서#include "..."#include <...>안으로 검색방향 - Protongun
  • 더블 쿼트에 포함 된 헤더는 항상 현재 작업 디렉토리에서 검색된다는 의미이므로이 대답은 잘못된 것 같습니다. 검색 메커니즘은 더욱 자세합니다. 이 대답은 불완전합니다. 불만 또는 우는 소리에이 덧글을 추가하지 않고 시스템에서이 답변을 투표 한 이유를 설명하기 위해 덧글을달라고 요청하기 때문에. - Carlo Wood

38

GCC 설명서에 나온다.이 둘의 차이점은 다음과 같습니다.

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

#include <file>

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

#include "file"

이 변형은 사용자 프로그램의 헤더 파일에 사용됩니다. 현재 파일이 들어있는 디렉토리에서 file이라는 파일을 먼저 찾은 다음 견적 디렉토리에서 다음과 같은 디렉토리를 찾습니다.<file>. 따옴표 디렉토리 목록에 디렉토리를 추가 할 수 있습니다.-iquote선택권.     의 인자‘#include’따옴표 또는 꺾쇠 괄호로 구분 되든, 주석이 인식되지 않으며 매크로 이름이 확장되지 않는다는 점에서 문자열 상수와 같이 동작합니다. 그러므로,#include <x/*y>이름이 지정된 시스템 헤더 파일의 포함을 지정합니다.x/*y.

그러나 파일에서 백 슬래시가 발생하면 이스케이프 문자가 아닌 일반 텍스트 문자로 간주됩니다. C에서 문자열 상수에 적합한 문자 이스케이프 시퀀스는 처리되지 않습니다. 그러므로,#include "x\n\\y"세 개의 백 슬래시가 포함 된 파일 이름을 지정합니다. (어떤 시스템에서는 '\'를 경로 이름 분리 자로 해석합니다.‘/’같은 방식으로. 사용하기에 가장 휴대형입니다.‘/’.)

파일 이름 다음에 행에 아무 것도 (주석 제외) 있으면 오류입니다.


27

그만큼<file>include는 전처리기를 검색하도록 지시합니다.-I디렉토리 및 사전 정의 된 디렉토리먼저, .c 파일의 디렉토리에서. 그만큼"file"include는 전처리 기가 소스 파일의 디렉토리를 검색하도록 지시합니다.먼저, 다음으로 되돌아갑니다.-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>파일이없는 경우 양식. 나머지는 구현에 따라 정의됩니다.


  • C 표준에서 어디에서 참조 할 수 있습니까?-I비즈니스가 지정 되었습니까? - juanchopanza
  • @ 준후 판자 완료. 맨 위로 대답을 참조하십시오 :) - Arkadiy
  • 나는 아무런 언급이 없다.-I. - juanchopanza
  • 그것은 "구현 정의 된" 부품. - Arkadiy
  • 한숨. 나는 대답했다, 당신은 그것이 언어로 구체화 된 것처럼 소리가 난다. - juanchopanza

18

표준에 의해 - 네, 그들은 다릅니다 :

  • 양식의 전처리 지시문

    #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와 b 사이의 사전 처리 토큰 시퀀스<>사전 처리 토큰 쌍 또는"문자는 단일 헤더 이름으로 결합됩니다. 사전 처리 토큰은 구현 정의입니다.

정의 :

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

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

이 표준은 구현이 정의한 방식 사이의 관계를 말하지 않는다는 점에 유의하십시오. 첫 번째 형식은 한 구현 정의 방식으로 검색하고 다른 형식은 구현 정의 방식으로 검색합니다. 또한이 표준은 특정 포함 파일이 있어야한다고 지정합니다 (예 :<stdio.h>).

공식적으로는 컴파일러의 설명서를 읽어야하지만 보통 (전통적으로)#include "..."form은 파일이있는 디렉토리를 검색합니다.#include먼저 발견 된 다음 디렉토리가#include <...>양식 검색 (포함 경로, 예 : 시스템 헤더).


  • 이것은 대부분 piCookie의 대답과 동일한 텍스트입니다.칠 년일찍이. - Kyle Strand
  • @KyleStrand 동일한 텍스트가 표준의 관련 섹션의 인용문이기 때문에 - 그 텍스트할까요동일해야한다. 실제 답변은 같은 텍스트가 아니며 다소 다르다. 또한 구현을위한 문서에 기록 될 것이라는 점도 알고 있지만 또한 이러한 것들이 해석되는 전통적인 방식이 있음을 알 수있다. (대부분 또는 모든 컴파일러 나는 존중을 사용했다). - skyking
  • IMO 이것은 표준이 말하는 것과 대부분의 컴파일러가 실제로하는 것을 다루기 때문에 가장 좋은 대답입니다. - plugwash

14

위대한 답변, 특히 주셔서 감사합니다. Adam Stelmaszczyk 및 piCookie, aib.

많은 프로그래머와 마찬가지로, 나는 비공식적 인"myApp.hpp"응용 프로그램 특정 파일에 대한 양식 및<libHeader.hpp>라이브러리 및 컴파일러 시스템 파일, 즉/I그리고INCLUDE환경 변수는 수년 동안 표준이라고 생각했습니다.

그러나 C 표준에 따르면 검색 순서는 구현에 따라 다르므로 이식성이 복잡해질 수 있습니다. 설상가상으로 우리는 잼 (jam)을 사용합니다. 잼 (jam)은 포함 파일의 위치를 자동으로 찾아냅니다. 포함 파일에 상대 경로 또는 절대 경로를 사용할 수 있습니다. 즉

#include "../../MyProgDir/SourceDir1/someFile.hpp"

이전 버전의 MSVS에서는 이중 백 슬래시 (\\)가 필요했지만 지금은 필요하지 않습니다. 그것이 언제 바뀌 었는지 나는 모른다. 'nix와의 호환성을 위해 슬래시를 사용하십시오 (Windows에서는이를 사용할 수 있습니다).

당신이있는 경우정말그것에 대해 걱정, 사용"./myHeader.h"소스 코드와 동일한 디렉토리에있는 포함 파일 (현재, 매우 큰 프로젝트에는 몇 가지 중복 포함 파일 이름이 포함되어 있습니다 - 실제로 구성 관리 문제).

여기에MSDN 설명귀하의 편의를 위해 여기에 복사).

인용 형식

전처리 기는 다음 순서로 포함 파일을 검색합니다.

  1. #include 문을 포함하는 파일과 동일한 디렉토리에 있습니다.
  2. 현재 열려있는 포함 파일의 디렉토리에서, 다음과 같은 역순으로

    그들은 열렸다. 상위 포함 파일의 디렉토리에서 검색이 시작되고

    모든 조부모 포함 파일의 디렉토리를 통해 위로 계속됩니다.
  3. 각 경로에 따라 지정됩니다./I컴파일러 옵션.
  4. 에 의해 지정된 경로를 따라INCLUDE환경 변수.

앵글 브래킷 형태

전처리 기는 다음 순서로 포함 파일을 검색합니다.

  1. 각 경로에 따라 지정됩니다./I컴파일러 옵션.
  2. 컴파일 할 때 명령 줄에서 지정한 경로를 따라INCLUDE환경 변수.


13

적어도 GCC 버전 ≤ 3.0 인 경우, 꺾쇠 괄호 형식은 포함 된 파일과 포함 된 파일 사이의 종속성을 생성하지 않습니다.

그러므로 의존성 규칙을 생성하려면 (예를 들어 GCC -M 옵션 사용) 종속성 트리에 포함되어야하는 파일에 인용 형식을 사용해야합니다.

(만나다http://gcc.gnu.org/onlinedocs/cpp/Invocation.html)


12

에 대한#include ""컴파일러는 일반적으로 포함하고 다른 폴더를 포함하는 파일의 폴더를 검색합니다. 에 대한#include <>컴파일러는 현재 파일의 폴더를 검색하지 않습니다.


  • 왜 사람들이 동의하지 않는지 잘 모릅니다. - Maxim Egorushkin
  • 대부분의 사람들이 자신의 CWD에있는 파일 만 컴파일하기 때문에 그럴 것이라고 생각됩니다. 디렉토리 foo에 있고 foo / unittest / bar.c를 컴파일하고 bar.h가 포함 된 경우 " bar.h " 작품 및 < bar.h > 하지 않습니다. - Arkadiy
  • @Maxim 사람들은 당신이 묘사하는 행동이 표준 C가 아니기 때문에 동의하지 않습니다. - osvein
  • @ Spookbuster Right, 표준 모두<filename>"filename"구현 정의 장소를 검색하십시오. - Maxim Egorushkin

12

#include <file.h>"includes"디렉토리에서 헤더를 검색하도록 컴파일러에 지시합니다. 컴파일러가 MinGW를 검색 할 것입니다.file.hC : \ MinGW \ include \ 또는 컴파일러가 설치된 곳.

#include "file"컴파일러에게 현재 디렉토리 (즉, 소스 파일이 상주하는 디렉토리)를 검색하도록 지시합니다.file.

당신은-IGCC가 깃발에 꺾쇠 괄호가있는 포함을 발견하면 그 다음에 디렉토리의 헤더도 검색해야 함을 알리는 플래그-I. GCC는 플래그 다음에 디렉토리를 마치includes예배 규칙서.

예를 들어, 파일이 있다면myheader.h자신의 디렉토리에#include <myheader.h>플래그로 GCC를 호출 한 경우-I .(현재 디렉토리에서 include를 검색해야 함을 나타냄).

~없이-I깃발, 너는 사용해야 할 것이다#include "myheader.h"파일을 포함 시키거나 이동myheader.h~로include귀하의 컴파일 디렉토리.


11

  • #include <>미리 정의 된 헤더 파일 용입니다.

헤더 파일이 미리 정의 된 경우, 대괄호 안에 헤더 파일 이름을 쓰면 다음과 같이됩니다 (미리 정의 된 헤더 파일 이름 iostream이 있다고 가정).

#include <iostream>
  • #include " "프로그래머가 정의한 헤더 파일 용

프로그래머가 자신의 헤더 파일을 작성한 경우 헤더 파일 이름을 따옴표로 작성합니다. 그래서, 당신이 헤더 파일을 썼다고 해보자.myfile.h, 다음은 include 지시문을 사용하여 파일을 포함시키는 방법의 예입니다.

#include "myfile.h"


9

꺽쇠 괄호가있는 #include는 포함될 파일에 대한 "구현 위치에 따른 장소 목록"( "시스템 헤더"를 말하는 매우 복잡한 방법)을 검색합니다.

인용 부호가있는 #include는 단지 파일을 검색 할 것이다 (그리고 "구현 - 의존적 인 방식으로", bleh). 즉, 일반적인 영어로, 당신이 그것에 던져 넣을 경로 / 파일 이름을 적용하려고 시도하고 그렇지 않으면 시스템 경로를 prepend하지 않거나 그렇지 않으면 그것을 변경하지 않습니다 것을 의미합니다.

또한 #include ""가 실패하면 표준에 따라 #include <>로 다시 읽습니다.

그만큼gcc 문서ISO 표준의 변호사 식 이야기보다 이해하기 쉽지만 표준이 아닌 gcc와 관련이 있지만 (컴파일러 관련) 설명이 있습니다.


  • 그러나 꺾쇠 괄호 또는 따옴표를 사용하면 파일이 포함되는 방식에 영향을주지 않으며 정확히 동일합니다. 사전 처리기는 기본적으로 포함 파일의 코드를 복사하여 ' 복사하여 큰 소스 파일을 만듭니다. 원본 소스 파일을 컴파일러에주기 전에 (선행 처리기는 #define, #if 평가 등과 같은 다른 일을하지만 #include 처리는 쉽습니다) - Loghorn
  • 갈등은 어떤가? 예를 들어zlib.h내 ' 사용자 ' 검색 경로가 있고 다른 버전이 시스템 검색 경로에 있으면#include <zlib.h>시스템 버전 및#include "zlib.h"내 자신을 포함합니까? - the_mandrill
  • 아하, 내 자신의 질문에 대답 :stackoverflow.com/questions/21593/… - the_mandrill
  • 표준 (들)일반적인 구현 규칙은 표준에 명시되지 않았기 때문에 알 수 없다는 단순한 설명이 아닌 여기에 모두 관련되어 있습니다. - Kyle Strand

9

#include < filename >을 사용할 때, 전처리 기는 C \ C ++ 헤더 파일 (stdio.h \ cstdio, 문자열, 벡터 등)의 디렉토리에서 파일을 찾고 있습니다. 하지만, #include "filename"을 사용할 때 : 현재 프로세서는 현재 디렉토리에서 파일을 찾고, 여기에 없다면 - C ++ 헤더 파일의 디렉토리에서 찾고 있습니다.


  • 완벽한 해답을 몇 년 동안 사용할 수있게 된 후, 왜 맹렬히 잘못 했나요? 일반적인 경우에도#include지시문은 파일과 전혀 관련이 없습니다. - IInspectable

8

여기서 많은 대답은 컴파일러가 파일을 찾기 위해 검색 할 경로에 초점을 맞 춥니 다. 이것이 대부분의 컴파일러에서하는 일이지만, 표준 컴파일러는 표준 헤더의 효과를 미리 프로그램 할 수 있으며,#include <list>스위치로, 파일로 존재할 필요는 없습니다.

이것은 순전히 가설이 아닙니다. 이런 식으로 작동하는 컴파일러가 적어도 하나 있습니다. 사용#include <xxx>표준 헤더 만 사용하는 것이 좋습니다.


  • 귀하의 () 안의 제한 사항을 어디에 표시 할 수 있습니까? - glglgl
  • 16.2.7을 읽은 후, 이것은 엄격한 준수를위한 요구 사항이 아닌 것처럼 보인다. 내 잘못이야. - sp2danny

8

#include "filename" // User defined header
#include <filename> // Standard library header.

예:

파일 이름은 다음과 같습니다.Seller.h:

#ifndef SELLER_H     // Header guard
#define SELLER_H     // Header guard

#include <string>
#include <iostream>
#include <iomanip>

class Seller
{
    private:
        char name[31];
        double sales_total;

    public:
        Seller();
        Seller(char[], double);
        char*getName();

#endif

클래스 구현 (예 :Seller.cpp, 그리고 파일을 사용할 다른 파일들Seller.h), 사용자가 정의한 헤더가 다음과 같이 포함되어야합니다.

#include "Seller.h"


8

#include <abc.h>

표준 라이브러리 파일을 포함하는 데 사용됩니다. 따라서 컴파일러는 표준 라이브러리 헤더가있는 위치를 체크인합니다.

#include "xyz.h"

사용자 정의 헤더 파일을 포함하도록 컴파일러에 지시합니다. 따라서 컴파일러는 현재 폴더의 헤더 파일을 검사하거나-I정의 된 폴더.


6

C ++에서는 두 가지 방법으로 파일을 포함시킵니다.

첫 번째 것은 사전 정의 된 기본 위치에서 파일을 찾도록 전 처리기에 알리는 #include입니다. 이 위치는 종종 파일을 포함 할 경로를 나타내는 INCLUDE 환경 변수입니다.

두 번째 유형은 #include "filename"입니다.이 파일은 전처리 기가 현재 디렉토리에서 파일을 찾은 다음 사용자가 미리 정의 된 위치에서 찾도록 지시합니다.


6

"< filename >"은 표준 C 라이브러리 위치를 검색합니다

"filename"은 현재 디렉토리에서도 검색합니다.

표준 C 라이브러리의 경우 < ...>, 현재 디렉토리에 작성하고있는 라이브러리의 경우 "..."를 사용하는 것이 이상적입니다.


  • 어떤 새로운 정보가이 답변을 다른 정보에 추가합니까? - Daniel Langr

5

그만큼#include <filename>시스템 파일을 참조 할 때 사용됩니다. 그것은 시스템 기본 위치에서 찾을 수있는 헤더 파일입니다./usr/include또는/usr/local/include. 자신의 파일을 다른 프로그램에 포함시켜야 할 경우에는#include "filename"통사론.


4

단순한 일반적인 규칙은 각진 대괄호를 사용하여 컴파일러와 함께 제공되는 헤더 파일을 포함시키는 것입니다. 큰 따옴표를 사용하여 다른 헤더 파일을 포함하십시오. 대부분의 컴파일러는 이렇게합니다.

1.9 - 헤더 파일프리 프로세서 지시문에 대해 자세히 설명합니다. 초보자 프로그래머라면이 페이지가 모든 것을 이해하는 데 도움이 될 것입니다. 나는 여기서 그것을 배웠고, 나는 직장에서 그것을 따라왔다.


3

#include <filename>

C / C ++ 시스템 또는 컴파일러 라이브러리의 헤더 파일을 사용하려는 경우에 사용됩니다. 이러한 라이브러리는 stdio.h, string.h, math.h 등이 될 수 있습니다.

#include "path-to-file/filename"

프로젝트 폴더 또는 다른 곳에있는 사용자 정의 헤더 파일을 사용하고자 할 때 사용됩니다.

전 처리기 및 헤더에 대한 자세한 정보. 독서C - 전처리 기.


2

양식 1 - #include "xxx"

먼저, 지시어가 호출 된 곳의 현재 디렉토리에서 헤더 파일의 존재 여부를 찾습니다. 발견되지 않으면 표준 시스템 디렉토리의 미리 구성된 목록을 검색합니다.

양식 2 - #include < xxx>

지시문이 호출 된 현재 디렉토리에서 헤더 파일이 있는지 찾습니다.


정확한 검색 디렉토리 목록은 대상 시스템, GCC 구성 방법 및 설치 위치에 따라 다릅니다. GCC 컴파일러의 검색 디렉토리 목록은 -v 옵션과 함께 실행하여 찾을 수 있습니다.

- I를 사용하여 검색 경로에 디렉토리를 추가 할 수 있습니다.당신이 명령은 현재 디렉토리 (지시문의 인용 형식)와 표준 시스템 디렉토리 앞에 dir을 검색하게합니다.


기본적으로 "xxx"형식은 현재 디렉토리에서 검색하는 것입니다. 양식을 되 찾을 수 없다면


1

현재 구성에 따라 gcc를 사용하여 시스템에서 검색 순서를 보려면 다음 명령을 실행할 수 있습니다. 이 명령에 대한 자세한 내용을 볼 수 있습니다.이리

cpp -v /dev/null -o /dev/null

Apple LLVM 버전 10.0.0 (clang-1000.10.44.2)

대상 : x86_64-apple-darwin18.0.0

스레드 모델 : posix InstalledDir : 라이브러리 / 개발자 / CommandLineTools / usr / bin

"/ Library / Developer / CommandLineTools / usr / bin / clang"-cc1 -triple   x86_64-apple-macosx10.14.0 -Wdeprecated-objc-isa-usage   -werror = deprecated-objc-isa-usage -E -disable-free -disable -llvm-verifier -discard-value-names -main-file-name null -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm -verbose -munwind-tables -target-cpu penryn -dwarf-column-info -debugger-tuning = lldb -target-linker-version 409.12 -v -resource-dir /Library/Developer/CommandLineTools/usr/lib/clang/10.0.0 -isysroot   /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk   -f / usr / local / include -fdebug-compilation-dir / Users / hogstrom -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -fblocks -fencode-extended-block-signature -fobjc-runtime = macosx- 10.14.0 -fmax-type-align = 16 -fdiagnostics-show-option -fcolor-diagnostics -raditional-cpp -o -xc / dev / null

clang -cc1 버전 10.0.0 (clang-1000.10.44.2) 기본 대상 x86_64-apple-darwin18.0.0 무시   존재하지 않는 디렉토리 "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/local/include"   존재하지 않는 디렉토리 무시 "/ 라이브러리 / 개발자 / 명령 줄 / SDKs /

#include "..."검색은 여기에서 시작합니다 :

#include < ...> 검색 시작 위치 :

/ usr / local / include

/Library/Developer/CommandLineTools/usr/lib/clang/10.0.0/include

/ 라이브러리 / 개발자 / CommandLineTools / usr / include

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks(프레임 워크 디렉토리)

검색 목록의 끝.


0

  #include <filename>   (1)     
  #include "filename"   (2)

#include파일 이름으로 식별되는 소스 파일을 지시문 바로 다음 행의 현재 소스 파일에 포함시킵니다.

지시문의 첫 번째 버전은 표준 include 만 검색합니다.   디렉토리. 표준 C 라이브러리뿐만 아니라 표준 C ++ 라이브러리,   표준 include 디렉토리에 내재적으로 포함됩니다. 표준   include 디렉토리는 컴파일러를 통해 사용자가 제어 할 수 있습니다.   옵션.

두 번째 버전은 먼저 현재 파일이있는 디렉토리를 검색합니다   파일이없는 경우에만 표준을 검색합니다   디렉토리를 포함하십시오.

파일을 찾을 수없는 경우 프로그램이 잘못 구성됩니다.


0

다음 두 가지 방법으로 #include 문을 작성할 수 있습니다.

#include"filename"
#include<filename>

각 양식의 의미는 다음과 같습니다.

#include"mylib.h"

이 명령은 파일을 찾습니다.mylib.h현재 디렉토리와 위에서 언급 한 지정된 디렉토리 목록에 설정되어있을 수 있습니다.

#include<mylib.h>

이 명령은 파일을 찾습니다.mylib.h지정된 디렉토리 목록에서만.

포함 검색 경로는 포함되는 파일을 검색 할 디렉토리 목록 일뿐입니다. 다른 C 컴파일러를 사용하면 검색 경로를 다른 방식으로 설정할 수 있습니다.


-1

더블 쿼트에 포함 된 헤더는 현재 디렉토리에서 찾을 수없는 경우 앵글 브라켓 포함과 동일한 시스템 경로에서 검색됩니다.


  • 이것은 문제의 지나치게 단순화 된 것이며 100 % 정확하지는 않습니다. 더 나은 대답이 있습니다. - Jonathan Leffler

-1

#include <filename>

C ++ 라이브러리에서 해당 파일을 찾습니다. hello.h라는 파일을 C ++ 라이브러리 폴더에 가지고 있다면,#include <hello.h>그것을로드합니다.

그러나,

#include "filename"

소스 파일이있는 동일한 디렉토리에서 파일을 찾습니다.

게다가,

#include "path_to_file/filename"

입력 한 디렉토리에서 파일을 찾습니다.path_to_file.


  • 이것에 대한 상당한 진실이 있지만, 대답은 미묘한 차이는 아니며 투표율이 높은 답변에 포함되는 모든 사항을 다루지는 않습니다. 유용한 추가 정보는 아닙니다. - Jonathan Leffler

-2

검색 헤더 파일의 순서가 다릅니다. < XXX.h >는 먼저 표준 헤더를 검색하는 것을 선호하지만 "XXX.h"는 작업 영역의 헤더 파일을 먼저 검색합니다.


  • < XXX.h >표준 헤더를 검색 하시겠습니까? - Peter Mortensen
  • @PeterMortensen뿐만 아니라 표준 헤더하지만 alose-Lgcc의 헤더 - Ezio
  • 이 대답은 유용하지 않습니다. 충분히 정확하거나 미묘한 차이는 없습니다. "-L헤더 " 특이하다. 그만큼-L옵션은 헤더가 아닌 라이브러리를 찾을 수있는 위치를 지정합니다. - Jonathan Leffler

연결된 질문


관련된 질문

최근 질문