C 및 C ++ 프로그래밍 언어에서 꺽쇠 괄호를 사용하고 따옴표를 사용하는 것의 차이는 무엇입니까?include
성명서?
#include <filename>
#include "filename"
실제로 차이점은 전 처리기가 포함 된 파일을 검색하는 위치에 있습니다.
에 대한#include <filename>
선행 처리기는 일반적으로 컴파일러 / IDE에 의해 미리 지정된 검색 디렉토리에서 구현 방식에 따라 검색합니다. 이 방법은 일반적으로 표준 라이브러리 헤더 파일을 포함하는 데 사용됩니다.
에 대한#include "filename"
선행 처리기는 지시문이 들어있는 파일과 동일한 디렉토리에서 먼저 검색 한 다음 해당 지시문이 들어있는 파일에 사용 된 검색 경로를 따릅니다.#include <filename>
형태. 이 메소드는 일반적으로 프로그래머가 정의한 헤더 파일을 포함하는 데 사용됩니다.
GCC에서 더 자세한 설명을 볼 수 있습니다.검색 경로 문서.
#include <...>
시스템에 설치된 패키지를 사용하고#include "..."
근처 저장소 버전을 사용했습니다. 나는 그것들을 거꾸로 가질지도 모른다. 어느 쪽이든, 패키지 헤더의 포함 가드에는 밑줄이 붙습니다. 버전 규정자가 나를 더 잘 이해할지라도 패키지를위한 협약 일 수도 있고 의도적으로 두 개를 혼합하는 것을 방지하는 방법 일 수도있다. - John P
알아야 할 유일한 방법은 구현 문서를 읽는 것입니다.
에서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 : 개행 문자를 제외한 소스 문자 집합의 모든 멤버 및
"
< 및>는 고유하게 파일을 가리키는 것은 아니라는 헤더를 참조합니다. 구현시 문자 시퀀스를 원하는만큼 자유롭게 사용할 수 있습니다. (대부분의 경우, 파일 이름으로 취급하고경로 포함, 다른 게시물 상태로.)
만약#include "file"
form이 사용되면, 구현은 먼저 지원되는 경우 주어진 이름의 파일을 찾습니다. 지원되지 않는 (지원되는) 경우 또는 검색이 실패하면 구현은 다른 (#include <file>
) 형태가 사용되었다.
또한 세 번째 형식이 존재하며#include
지시문이 위 양식 중 하나와 일치하지 않습니다. 이 형식에서 매크로 사전 설정과 같은 일부 기본 사전 처리가#include
지시문을 사용하면 결과가 다른 두 가지 형식 중 하나와 일치 할 것으로 예상됩니다.
<
과>
도서관에 색인을 생성하는 열쇠입니다. - Adrian McCarthy
여기서 좋은 대답은 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에 의해 정의되지 않은 것 같습니다).
c99
- 이것은 C 컴파일러의 POSIX 이름입니다. (POSIX 2008 표준은 C11을 거의 참조하지 않을 수 있지만 POSIX 2008의 2013 업데이트는 C 표준을 변경하지 않았습니다.) - Jonathan Leffler
그렇습니다:
"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 Thompsondefaultincludepaths
, 다른 의미를 부여하는 것과는.
(위에서 언급 한 바와 같이). 이것은 예상되는 결과로서#include "..."
과#include <...>
안으로 검색방향 - Protongun
GCC 설명서에 나온다.이 둘의 차이점은 다음과 같습니다.
사전 처리 지시문을 사용하여 사용자 및 시스템 헤더 파일이 모두 포함됩니다.
‘#include’
. 그것은 두 가지 변종이 있습니다 :
#include <file>
이 변형은 시스템 헤더 파일에 사용됩니다. 시스템 디렉토리의 표준 목록에서 file이라는 파일을 검색합니다. 이 목록에 디렉토리를 추가 할 수 있습니다.
-I
옵션기도).
#include "file"
이 변형은 사용자 프로그램의 헤더 파일에 사용됩니다. 현재 파일이 들어있는 디렉토리에서 file이라는 파일을 먼저 찾은 다음 견적 디렉토리에서 다음과 같은 디렉토리를 찾습니다.
<file>
. 따옴표 디렉토리 목록에 디렉토리를 추가 할 수 있습니다.-iquote
선택권. 의 인자‘#include’
따옴표 또는 꺾쇠 괄호로 구분 되든, 주석이 인식되지 않으며 매크로 이름이 확장되지 않는다는 점에서 문자열 상수와 같이 동작합니다. 그러므로,#include <x/*y>
이름이 지정된 시스템 헤더 파일의 포함을 지정합니다.x/*y
.그러나 파일에서 백 슬래시가 발생하면 이스케이프 문자가 아닌 일반 텍스트 문자로 간주됩니다. C에서 문자열 상수에 적합한 문자 이스케이프 시퀀스는 처리되지 않습니다. 그러므로,
#include "x\n\\y"
세 개의 백 슬래시가 포함 된 파일 이름을 지정합니다. (어떤 시스템에서는 '\'를 경로 이름 분리 자로 해석합니다.‘/’
같은 방식으로. 사용하기에 가장 휴대형입니다.‘/’
.)파일 이름 다음에 행에 아무 것도 (주석 제외) 있으면 오류입니다.
그만큼<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>
파일이없는 경우 양식. 나머지는 구현에 따라 정의됩니다.
-I
비즈니스가 지정 되었습니까? - juanchopanza-I
. - juanchopanza
표준에 의해 - 네, 그들은 다릅니다 :
양식의 전처리 지시문
#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 <...>
양식 검색 (포함 경로, 예 : 시스템 헤더).
위대한 답변, 특히 주셔서 감사합니다. Adam Stelmaszczyk 및 piCookie, aib.
많은 프로그래머와 마찬가지로, 나는 비공식적 인"myApp.hpp"
응용 프로그램 특정 파일에 대한 양식 및<libHeader.hpp>
라이브러리 및 컴파일러 시스템 파일, 즉/I
그리고INCLUDE
환경 변수는 수년 동안 표준이라고 생각했습니다.
그러나 C 표준에 따르면 검색 순서는 구현에 따라 다르므로 이식성이 복잡해질 수 있습니다. 설상가상으로 우리는 잼 (jam)을 사용합니다. 잼 (jam)은 포함 파일의 위치를 자동으로 찾아냅니다. 포함 파일에 상대 경로 또는 절대 경로를 사용할 수 있습니다. 즉
#include "../../MyProgDir/SourceDir1/someFile.hpp"
이전 버전의 MSVS에서는 이중 백 슬래시 (\\)가 필요했지만 지금은 필요하지 않습니다. 그것이 언제 바뀌 었는지 나는 모른다. 'nix와의 호환성을 위해 슬래시를 사용하십시오 (Windows에서는이를 사용할 수 있습니다).
당신이있는 경우정말그것에 대해 걱정, 사용"./myHeader.h"
소스 코드와 동일한 디렉토리에있는 포함 파일 (현재, 매우 큰 프로젝트에는 몇 가지 중복 포함 파일 이름이 포함되어 있습니다 - 실제로 구성 관리 문제).
여기에MSDN 설명귀하의 편의를 위해 여기에 복사).
인용 형식
전처리 기는 다음 순서로 포함 파일을 검색합니다.
- #include 문을 포함하는 파일과 동일한 디렉토리에 있습니다.
- 현재 열려있는 포함 파일의 디렉토리에서, 다음과 같은 역순으로
그들은 열렸다. 상위 포함 파일의 디렉토리에서 검색이 시작되고
모든 조부모 포함 파일의 디렉토리를 통해 위로 계속됩니다.- 각 경로에 따라 지정됩니다.
/I
컴파일러 옵션.- 에 의해 지정된 경로를 따라
INCLUDE
환경 변수.앵글 브래킷 형태
전처리 기는 다음 순서로 포함 파일을 검색합니다.
- 각 경로에 따라 지정됩니다.
/I
컴파일러 옵션.- 컴파일 할 때 명령 줄에서 지정한 경로를 따라
INCLUDE
환경 변수.
적어도 GCC 버전 ≤ 3.0 인 경우, 꺾쇠 괄호 형식은 포함 된 파일과 포함 된 파일 사이의 종속성을 생성하지 않습니다.
그러므로 의존성 규칙을 생성하려면 (예를 들어 GCC -M 옵션 사용) 종속성 트리에 포함되어야하는 파일에 인용 형식을 사용해야합니다.
에 대한#include ""
컴파일러는 일반적으로 포함하고 다른 폴더를 포함하는 파일의 폴더를 검색합니다. 에 대한#include <>
컴파일러는 현재 파일의 폴더를 검색하지 않습니다.
<filename>
과"filename"
구현 정의 장소를 검색하십시오. - Maxim Egorushkin
#include <file.h>
"includes"디렉토리에서 헤더를 검색하도록 컴파일러에 지시합니다. 컴파일러가 MinGW를 검색 할 것입니다.file.h
C : \ MinGW \ include \ 또는 컴파일러가 설치된 곳.
#include "file"
컴파일러에게 현재 디렉토리 (즉, 소스 파일이 상주하는 디렉토리)를 검색하도록 지시합니다.file
.
당신은-I
GCC가 깃발에 꺾쇠 괄호가있는 포함을 발견하면 그 다음에 디렉토리의 헤더도 검색해야 함을 알리는 플래그-I
. GCC는 플래그 다음에 디렉토리를 마치includes
예배 규칙서.
예를 들어, 파일이 있다면myheader.h
자신의 디렉토리에#include <myheader.h>
플래그로 GCC를 호출 한 경우-I .
(현재 디렉토리에서 include를 검색해야 함을 나타냄).
~없이-I
깃발, 너는 사용해야 할 것이다#include "myheader.h"
파일을 포함 시키거나 이동myheader.h
~로include
귀하의 컴파일 디렉토리.
#include <>
미리 정의 된 헤더 파일 용입니다.헤더 파일이 미리 정의 된 경우, 대괄호 안에 헤더 파일 이름을 쓰면 다음과 같이됩니다 (미리 정의 된 헤더 파일 이름 iostream이 있다고 가정).
#include <iostream>
#include " "
프로그래머가 정의한 헤더 파일 용프로그래머가 자신의 헤더 파일을 작성한 경우 헤더 파일 이름을 따옴표로 작성합니다. 그래서, 당신이 헤더 파일을 썼다고 해보자.myfile.h
, 다음은 include 지시문을 사용하여 파일을 포함시키는 방법의 예입니다.
#include "myfile.h"
꺽쇠 괄호가있는 #include는 포함될 파일에 대한 "구현 위치에 따른 장소 목록"( "시스템 헤더"를 말하는 매우 복잡한 방법)을 검색합니다.
인용 부호가있는 #include는 단지 파일을 검색 할 것이다 (그리고 "구현 - 의존적 인 방식으로", bleh). 즉, 일반적인 영어로, 당신이 그것에 던져 넣을 경로 / 파일 이름을 적용하려고 시도하고 그렇지 않으면 시스템 경로를 prepend하지 않거나 그렇지 않으면 그것을 변경하지 않습니다 것을 의미합니다.
또한 #include ""가 실패하면 표준에 따라 #include <>로 다시 읽습니다.
그만큼gcc 문서ISO 표준의 변호사 식 이야기보다 이해하기 쉽지만 표준이 아닌 gcc와 관련이 있지만 (컴파일러 관련) 설명이 있습니다.
zlib.h
내 ' 사용자 ' 검색 경로가 있고 다른 버전이 시스템 검색 경로에 있으면#include <zlib.h>
시스템 버전 및#include "zlib.h"
내 자신을 포함합니까? - the_mandrill
#include < filename >을 사용할 때, 전처리 기는 C \ C ++ 헤더 파일 (stdio.h \ cstdio, 문자열, 벡터 등)의 디렉토리에서 파일을 찾고 있습니다. 하지만, #include "filename"을 사용할 때 : 현재 프로세서는 현재 디렉토리에서 파일을 찾고, 여기에 없다면 - C ++ 헤더 파일의 디렉토리에서 찾고 있습니다.
#include
지시문은 파일과 전혀 관련이 없습니다. - IInspectable
여기서 많은 대답은 컴파일러가 파일을 찾기 위해 검색 할 경로에 초점을 맞 춥니 다. 이것이 대부분의 컴파일러에서하는 일이지만, 표준 컴파일러는 표준 헤더의 효과를 미리 프로그램 할 수 있으며,#include <list>
스위치로, 파일로 존재할 필요는 없습니다.
이것은 순전히 가설이 아닙니다. 이런 식으로 작동하는 컴파일러가 적어도 하나 있습니다. 사용#include <xxx>
표준 헤더 만 사용하는 것이 좋습니다.
#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"
#include <abc.h>
표준 라이브러리 파일을 포함하는 데 사용됩니다. 따라서 컴파일러는 표준 라이브러리 헤더가있는 위치를 체크인합니다.
#include "xyz.h"
사용자 정의 헤더 파일을 포함하도록 컴파일러에 지시합니다. 따라서 컴파일러는 현재 폴더의 헤더 파일을 검사하거나-I
정의 된 폴더.
C ++에서는 두 가지 방법으로 파일을 포함시킵니다.
첫 번째 것은 사전 정의 된 기본 위치에서 파일을 찾도록 전 처리기에 알리는 #include입니다. 이 위치는 종종 파일을 포함 할 경로를 나타내는 INCLUDE 환경 변수입니다.
두 번째 유형은 #include "filename"입니다.이 파일은 전처리 기가 현재 디렉토리에서 파일을 찾은 다음 사용자가 미리 정의 된 위치에서 찾도록 지시합니다.
"< filename >"은 표준 C 라이브러리 위치를 검색합니다
"filename"은 현재 디렉토리에서도 검색합니다.
표준 C 라이브러리의 경우 < ...>, 현재 디렉토리에 작성하고있는 라이브러리의 경우 "..."를 사용하는 것이 이상적입니다.
그만큼#include <filename>
시스템 파일을 참조 할 때 사용됩니다. 그것은 시스템 기본 위치에서 찾을 수있는 헤더 파일입니다./usr/include
또는/usr/local/include
. 자신의 파일을 다른 프로그램에 포함시켜야 할 경우에는#include "filename"
통사론.
단순한 일반적인 규칙은 각진 대괄호를 사용하여 컴파일러와 함께 제공되는 헤더 파일을 포함시키는 것입니다. 큰 따옴표를 사용하여 다른 헤더 파일을 포함하십시오. 대부분의 컴파일러는 이렇게합니다.
1.9 - 헤더 파일프리 프로세서 지시문에 대해 자세히 설명합니다. 초보자 프로그래머라면이 페이지가 모든 것을 이해하는 데 도움이 될 것입니다. 나는 여기서 그것을 배웠고, 나는 직장에서 그것을 따라왔다.
#include <filename>
C / C ++ 시스템 또는 컴파일러 라이브러리의 헤더 파일을 사용하려는 경우에 사용됩니다. 이러한 라이브러리는 stdio.h, string.h, math.h 등이 될 수 있습니다.
#include "path-to-file/filename"
프로젝트 폴더 또는 다른 곳에있는 사용자 정의 헤더 파일을 사용하고자 할 때 사용됩니다.
전 처리기 및 헤더에 대한 자세한 정보. 독서C - 전처리 기.
먼저, 지시어가 호출 된 곳의 현재 디렉토리에서 헤더 파일의 존재 여부를 찾습니다. 발견되지 않으면 표준 시스템 디렉토리의 미리 구성된 목록을 검색합니다.
지시문이 호출 된 현재 디렉토리에서 헤더 파일이 있는지 찾습니다.
정확한 검색 디렉토리 목록은 대상 시스템, GCC 구성 방법 및 설치 위치에 따라 다릅니다. GCC 컴파일러의 검색 디렉토리 목록은 -v 옵션과 함께 실행하여 찾을 수 있습니다.
- I를 사용하여 검색 경로에 디렉토리를 추가 할 수 있습니다.당신이 명령은 현재 디렉토리 (지시문의 인용 형식)와 표준 시스템 디렉토리 앞에 dir을 검색하게합니다.
기본적으로 "xxx"형식은 현재 디렉토리에서 검색하는 것입니다. 양식을 되 찾을 수 없다면
현재 구성에 따라 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(프레임 워크 디렉토리)
검색 목록의 끝.
#include <filename> (1)
#include "filename" (2)
#include
파일 이름으로 식별되는 소스 파일을 지시문 바로 다음 행의 현재 소스 파일에 포함시킵니다.
지시문의 첫 번째 버전은 표준 include 만 검색합니다. 디렉토리. 표준 C 라이브러리뿐만 아니라 표준 C ++ 라이브러리, 표준 include 디렉토리에 내재적으로 포함됩니다. 표준 include 디렉토리는 컴파일러를 통해 사용자가 제어 할 수 있습니다. 옵션.
두 번째 버전은 먼저 현재 파일이있는 디렉토리를 검색합니다 파일이없는 경우에만 표준을 검색합니다 디렉토리를 포함하십시오.
파일을 찾을 수없는 경우 프로그램이 잘못 구성됩니다.
다음 두 가지 방법으로 #include 문을 작성할 수 있습니다.
#include"filename"
#include<filename>
각 양식의 의미는 다음과 같습니다.
#include"mylib.h"
이 명령은 파일을 찾습니다.mylib.h
현재 디렉토리와 위에서 언급 한 지정된 디렉토리 목록에 설정되어있을 수 있습니다.
#include<mylib.h>
이 명령은 파일을 찾습니다.mylib.h
지정된 디렉토리 목록에서만.
포함 검색 경로는 포함되는 파일을 검색 할 디렉토리 목록 일뿐입니다. 다른 C 컴파일러를 사용하면 검색 경로를 다른 방식으로 설정할 수 있습니다.
더블 쿼트에 포함 된 헤더는 현재 디렉토리에서 찾을 수없는 경우 앵글 브라켓 포함과 동일한 시스템 경로에서 검색됩니다.
#include <filename>
C ++ 라이브러리에서 해당 파일을 찾습니다.
hello.h라는 파일을 C ++ 라이브러리 폴더에 가지고 있다면,#include <hello.h>
그것을로드합니다.
그러나,
#include "filename"
소스 파일이있는 동일한 디렉토리에서 파일을 찾습니다.
게다가,
#include "path_to_file/filename"
입력 한 디렉토리에서 파일을 찾습니다.path_to_file
.
검색 헤더 파일의 순서가 다릅니다. < XXX.h >는 먼저 표준 헤더를 검색하는 것을 선호하지만 "XXX.h"는 작업 영역의 헤더 파일을 먼저 검색합니다.
-L
gcc의 헤더 - Ezio-L
헤더 " 특이하다. 그만큼-L
옵션은 헤더가 아닌 라이브러리를 찾을 수있는 위치를 지정합니다. - Jonathan Leffler