C 및 C ++ 프로그래밍 언어에서 include
다음과 같이 명령문 에서 꺾쇠 괄호 사용과 따옴표 사용의 차이점은 무엇 입니까?
#include <filename>
#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>
파일을 찾을 수없는 경우 양식을. 나머지는 구현 정의입니다.