test.c
: 검색됩니다 디렉토리 위의 문에서C/C++에서 명령문 검색을 포함하는 디렉토리는 무엇입니까?
#include "file.h"
?
test.c
이있는 디렉토리가 검색 될 것이라고 가정합니다.
하지만 그게 전부입니까?
알아두기, 헤더 파일을 사용하면 어떤 이점이 있습니까? Java는 헤더 파일을 필요로하지 않습니다 ...
test.c
: 검색됩니다 디렉토리 위의 문에서C/C++에서 명령문 검색을 포함하는 디렉토리는 무엇입니까?
#include "file.h"
?
test.c
이있는 디렉토리가 검색 될 것이라고 가정합니다.
하지만 그게 전부입니까?
알아두기, 헤더 파일을 사용하면 어떤 이점이 있습니까? Java는 헤더 파일을 필요로하지 않습니다 ...
그것은 귀하의 컴파일러에서 제어합니다. 예를 들어 gcc에는 포함 경로를 지정하는 -I
옵션이 있습니다.
컴파일러 (링커와 구별 됨)가 올바른 인수로 함수를 호출 할 수 있도록 C 및 C++ 프로토 타입이 필요합니다. Java는 컴파일러가 바이너리 .class 파일 (C와 달리 모든 유형 정보가 보존 된 표준 바이트 코드 형식으로되어 있음)을 사용하여 호출이 유효한지 확인합니다.
그러나'stdlib.h '가 어디에 있는지와 같은 기본 경로가 있어야합니다. – user198729
당신의 질문은''test.h ''에 관한 것이지,'
#include <header_name>
: 표준 포함 파일 : 첫 번째 (시스템이 컴파일러에 대한 경로 설정 포함) 표준 경로를 보면#include "header_name"
: 현재 경로에 봐 첫째, 경로 (프로젝트 별 검색 경로)헤더 파일을 사용하면 라이브러리 파일을 구현하지 않고 다른 사람에게 라이브러리의 인터페이스를 제공 할 수 있습니다. Java 바이트 코드 또는 jar가 자체 (설명)를 설명 할 수 있기 때문에 Java에서는이를 요구하지 않습니다. C 코드는 (아직) 수행 할 수 없습니다.
자바에서는 jar 파일 만 필요하고 올바른 사용 문이 있습니다. C에서는 (주로) 헤더와 lib 파일 (또는 헤더와 dll)이 필요합니다.
다른 이유는 c 코드가 컴파일되는 방식입니다. 컴파일러는 변환 단위 (모든 포함 된 헤더가있는 c/cpp 파일)를 컴파일하고 두 번째 단계의 링커는 전체 내용을 연결합니다. 선언을 컴파일해서는 안되며 링커가 정리해야하는 각 컴파일 단위에 대해 생성 된 시간을 절약하고 쓸모없는 코드를 만들지 않아야합니다.
이것은 일반적인 생각 일 뿐이며 컴파일러 전문가는 아니지만 약간의 도움이됩니다.
표준 경로는 무엇이며 C/C++에서 reflexion을 사용할 수없는 이유는 무엇입니까? – user198729
시스템 헤더가 저장되는 시스템 (및 컴파일러 종속적 일 수 있음) 경로가 있습니다. 예를 들어, * nix 시스템은'/ usr/include /'를 사용하는 경향이있다. – Dusty
표준 include 경로는 시스템마다 다르고 C++에서는 파일 시스템을 전혀 사용하지 않아도된다. 컴파일러가 컴파일 된 라이브러리를 사용하여 유형을 검사 할 수없는 이유는 유형 정보가 모두 보존되지 않고 표준 ABI (Application Binary Interface)가 없기 때문입니다. –
#include
뒤에 인용 부호를 사용하면 #include 문을 포함하는 파일의 동일한 디렉토리에 포함 파일을 찾은 다음 해당 파일을 포함하는 파일의 디렉토리에 포함 파일을 찾습니다 (#include). 그러면 전처리 기가/I 컴파일러 옵션에 지정된 경로를 따라 찾은 다음 INCLUDE 환경 변수에 지정된 경로를 따라 검색합니다. 당신은 꺾쇠 괄호 양식을 사용하는 경우
가,가/I 컴파일러 옵션에 의해 지정된 경로를 따라 첫 번째 파일을 포함 검색 할 수있는 전처리를 지시 한 후,에 의해 지정된 경로를 따라, 명령 줄에서 컴파일 할 때 환경을 INCLUDE 변하기 쉬운.
꺽쇠 괄호를 사용할 때 현재 디렉토리가 경로에 있지 않으면 컴파일러는 현재 디렉토리를 찾지 않습니다 * 않습니다 *. 이 결과로'#include
이런 이유로 나는 사람들이 자신의 코드에서 #include 문에 꺽쇠 괄호를 거의 사용하지 않아야한다는 것을 종종 자랑스럽게 여긴다. 그러나이 호언 장담은 보통 귀머거리에 귀착된다. –
strace 또는 트러스 등이 도움이 될 수 있습니다. 예를 들어 foo.c
파일을 #include "foo.h"
이라는 단일 행으로 만듭니다.그런 다음 CYGWIN에, 명령 :
strace /usr/bin/gcc-4.exe foo.c | grep 'src_path.*foo.h,' | sed 's/.*src_path //;s/foo.h.*//'
가 생성됩니다
foo.c:1:22: error: foo.h: No such file or directory
/home/Joe/src/utilities/
/usr/lib/gcc/i686-pc-cygwin/4.3.4/include/
/usr/lib/gcc/i686-pc-cygwin/4.3.4/include-fixed/
/usr/include/
/usr/include/w32api/
나는이 목록이 너무 짧았다 놀랐다 : 나는 15 년 전에 SunOS의 4에서이 운동을했던 마지막 시간, 검색 경로에는 12 개의 디렉토리가있었습니다.
첫 번째 디렉토리는 분명히 foo.c가있는 곳입니다. 환경 변수 CPATH
및 C_INCLUDE_PATH
에 대해서는 http://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html을 참조하십시오. 그러나 이들은 내 컴퓨터에 설정되어 있지 않습니다. (그리고 나는 Cygwin에서 어쨌든, 그 사용 여부 불분명입니다.)
편집 :는 가장 간단한 해결책은 cpp -v
사용하는 것입니다 (하지GCC를 -v). 그것은 :
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i686'
/usr/lib/gcc/i686-pc-cygwin/4.3.4/cc1.exe -E -quiet -v -D__CYGWIN32__ -D__CYGWIN__
-Dunix -D__unix__ -D__unix -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../..
/include/w32api -idirafter
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api -
-mtune=generic -march=i686
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/include"
ignoring duplicate directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i686-pc-cygwin/4.3.4/include
/usr/lib/gcc/i686-pc-cygwin/4.3.4/include-fixed
/usr/include
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api
End of search list.
편집 : 더 많은 gcc 문서 : http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html#Search-Path –
C++ 표준은 실제로 어떤 디렉토리를 검색해야하는지에 대해서는 말하지 않습니다.
이형태
# include "q-char-sequence" new-line
의 전처리 지시어는 소스 파일 식별 의 전체 내용에 의해 그 지시어의 교체 원인 :이 C++ 표준
#include "somefile.h"
가 발생했을 때 발생하는 방법을 설명입니다 구분 기호 사이에 시퀀스가 지정되었습니다. 명명 된 소스 파일은 검색 방식으로 검색된 입니다.이 검색이 아닌 경우 지원하거나 검색이 실패하는 경우는 동일 함유 시퀀스 으로# include <h-char-sequence> new-line
읽으면 같이 지시자 일본어 지침에서 (문자> 포함한 경우) 재 처리이다.
그래서 정확히 어떤 디렉토리가 검색되는지는 특정 C++ 구현의 자비입니다.
@Neil : 내 컴퓨터에서 '-print-search-dirs'는 포함하지 않습니다. 임의의 포함 디렉토리. –
@Joseph B * gger. 당신 말이 맞아요. 나는 그렇게하겠다고 맹세했지만, 실행 파일과 라이브러리 검색 경로 만 출력합니다. –
컴파일러/플랫폼은 무엇입니까? – Stephen