2010-06-11 3 views

답변

2

그것은 귀하의 컴파일러에서 제어합니다. 예를 들어 gcc에는 포함 경로를 지정하는 -I 옵션이 있습니다.

컴파일러 (링커와 구별 됨)가 올바른 인수로 함수를 호출 할 수 있도록 C 및 C++ 프로토 타입이 필요합니다. Java는 컴파일러가 바이너리 .class 파일 (C와 달리 모든 유형 정보가 보존 된 표준 바이트 코드 형식으로되어 있음)을 사용하여 호출이 유효한지 확인합니다.

+0

그러나'stdlib.h '가 어디에 있는지와 같은 기본 경로가 있어야합니다. – user198729

+1

당신의 질문은''test.h ''에 관한 것이지,''이 아닙니다. stdlib.h와 같은 표준 헤더는 대괄호 구문 ('')을 사용하며,이 헤더는 기본 시스템 경로에 있습니다. –

7
  • #include <header_name> : 표준 포함 파일 : 첫 번째 (시스템이 컴파일러에 대한 경로 설정 포함) 표준 경로를 보면
  • #include "header_name" : 현재 경로에 봐 첫째, 경로 (프로젝트 별 검색 경로)
을 포함 다음에

헤더 파일을 사용하면 라이브러리 파일을 구현하지 않고 다른 사람에게 라이브러리의 인터페이스를 제공 할 수 있습니다. Java 바이트 코드 또는 jar가 자체 (설명)를 설명 할 수 있기 때문에 Java에서는이를 요구하지 않습니다. C 코드는 (아직) 수행 할 수 없습니다.

자바에서는 jar 파일 만 필요하고 올바른 사용 문이 있습니다. C에서는 (주로) 헤더와 lib 파일 (또는 헤더와 dll)이 필요합니다.

다른 이유는 c 코드가 컴파일되는 방식입니다. 컴파일러는 변환 단위 (모든 포함 된 헤더가있는 c/cpp 파일)를 컴파일하고 두 번째 단계의 링커는 전체 내용을 연결합니다. 선언을 컴파일해서는 안되며 링커가 정리해야하는 각 컴파일 단위에 대해 생성 된 시간을 절약하고 쓸모없는 코드를 만들지 않아야합니다.

이것은 일반적인 생각 일 뿐이며 컴파일러 전문가는 아니지만 약간의 도움이됩니다.

+0

표준 경로는 무엇이며 C/C++에서 reflexion을 사용할 수없는 이유는 무엇입니까? – user198729

+0

시스템 헤더가 저장되는 시스템 (및 컴파일러 종속적 일 수 있음) 경로가 있습니다. 예를 들어, * nix 시스템은'/ ​​usr/include /'를 사용하는 경향이있다. – Dusty

+0

표준 include 경로는 시스템마다 다르고 C++에서는 파일 시스템을 전혀 사용하지 않아도된다. 컴파일러가 컴파일 된 라이브러리를 사용하여 유형을 검사 할 수없는 이유는 유형 정보가 모두 보존되지 않고 표준 ABI (Application Binary Interface)가 없기 때문입니다. –

0

#include 뒤에 인용 부호를 사용하면 #include 문을 포함하는 파일의 동일한 디렉토리에 포함 파일을 찾은 다음 해당 파일을 포함하는 파일의 디렉토리에 포함 파일을 찾습니다 (#include). 그러면 전처리 기가/I 컴파일러 옵션에 지정된 경로를 따라 찾은 다음 INCLUDE 환경 변수에 지정된 경로를 따라 검색합니다. 당신은 꺾쇠 괄호 양식을 사용하는 경우

가,가/I 컴파일러 옵션에 의해 지정된 경로를 따라 첫 번째 파일을 포함 검색 할 수있는 전처리를 지시 한 후,에 의해 지정된 경로를 따라, 명령 줄에서 컴파일 할 때 환경을 INCLUDE 변하기 쉬운.

+0

꺽쇠 괄호를 사용할 때 현재 디렉토리가 경로에 있지 않으면 컴파일러는 현재 디렉토리를 찾지 않습니다 * 않습니다 *. 이 결과로'#include '(경로가 없다는 것을 의미)을 포함하고 bh가 아아와 같은 디렉토리에있는'#include '를 사용하면'#include ' 해당 디렉토리가 경로에 없습니다. –

+0

이런 이유로 나는 사람들이 자신의 코드에서 #include 문에 꺽쇠 괄호를 거의 사용하지 않아야한다는 것을 종종 자랑스럽게 여긴다. 그러나이 호언 장담은 보통 귀머거리에 귀착된다. –

0

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가있는 곳입니다. 환경 변수 CPATHC_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. 
+0

편집 : 더 많은 gcc 문서 : http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html#Search-Path –

0

C++ 표준은 실제로 어떤 디렉토리를 검색해야하는지에 대해서는 말하지 않습니다.

형태

# include "q-char-sequence" new-line 

의 전처리 지시어는 소스 파일 식별 의 전체 내용에 의해 그 지시어의 교체 원인 :이 C++ 표준 #include "somefile.h"가 발생했을 때 발생하는 방법을 설명입니다 구분 기호 사이에 시퀀스가 ​​지정되었습니다. 명명 된 소스 파일은 검색 방식으로 검색된 입니다.이 검색이 아닌 경우 지원하거나 검색이 실패하는 경우는 동일 함유 시퀀스 으로

# include <h-char-sequence> new-line 

읽으면 같이 지시자 일본어 지침에서 (문자> 포함한 경우) 재 처리이다.

그래서 정확히 어떤 디렉토리가 검색되는지는 특정 C++ 구현의 자비입니다.

+0

@Neil : 내 컴퓨터에서 '-print-search-dirs'는 포함하지 않습니다. 임의의 포함 디렉토리. –

+0

@Joseph B * gger. 당신 말이 맞아요. 나는 그렇게하겠다고 맹세했지만, 실행 파일과 라이브러리 검색 경로 만 출력합니다. –

관련 문제