2012-08-08 3 views
1

헤더가있는 다른 hi.cpp 파일에서 함수 fhi를 사용하는 "Hello World"코드가 있습니다. 올바른헤더 포함 및 사용

내 나의 이해는 다음있어서 잘못된 경우 :

내가 대신 헤더 파일에 더 읽기 보이는 것을 그 사실을 제외하고 아무 문제없이 헤더를 사용 #include "c:\c\hi.cpp" 같은 CPP 파일을 포함 할 수 있습니다.

메인 프로그램 hi.h에 샘플과 같은 헤더를 포함 시키려면 hi.hhi.cpp을 포함해야하며, 동일한 파일 이름 hi에 따라 자동으로 수행해야합니다. 컴파일러가 어떻게 기능을 알고 있는지 궁금 하네 fhi 본문입니다.

헤더 및 cpp 파일에 다른 이름을 사용할 수 있습니까?

는 programm에 :

#include "stdafx.h" 
#include "c:\c\hi.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
fhi(1); 
return 0; 
} 

hi.h

#include <cstdlib> 
#include <iostream> 

int var; 
int fhi(int f); 

는 hi.cpp

#include <cstdlib> 
#include <iostream> 

int fhi(int f) 
{ 
return 0; 
} 

답변

2

는 hi.h는 hi.cpp에게

0123을 포함해야

번호 hi.h은 다른 .cpp 파일에 의해 다른 선언 일뿐입니다.

저는 컴파일러가 함수 fhi body가 어디에 있는지를 알고 있습니다.

아니요. 모든 * .cpp 파일을 오브젝트 파일로 컴파일해야합니다. 귀하의 경우에는 두 개의 객체 파일, 즉 program.ohi.o이 있습니다. 링커는 이제이 두 개의 객체 파일을 가져 와서 실행 파일을 추출 할 수 있습니다. 다른 함수 (이 경우 fhi (..)의 실제 정의)에 대한 참조는이 단계에서 해결됩니다.

#includes에서 절대 경로를 사용하는 이유는 무엇입니까? "c"디렉토리를 이동할 때마다 깨질 것입니다.

+0

hi.c 및 hi.cpp는 프로젝트와 다른 디렉토리에 있습니다. 나는 헤더가'#include "c : \ c \ hi.h"에 의해 저항하는 컴파일러에게 말했다. hi.cpp가 어디에 있는지 컴파일러에게 알려주는 방법? 당신은 절대 경로에 관한 것입니다. – vico

+0

상대 경로를 사용하십시오. ../otherDir/otherFile.h " – SuperSaiyan

+0

" "../ otherDir/otherFile.h"'예, 이것은 컴파일러에게 .h가 어디에 있는지 알려줍니다. 그러나 컴파일러가 .cpp의 위치를 ​​어떻게 알 수 있습니까? 제 경우에는 cpp가'../ otherDir /'에 있습니다 – vico

2

일반적으로 빌드 시스템이 .cpp 파일을 오브젝트 파일로 컴파일 한 다음 주 실행 파일을 빌드하는 데 사용됩니다. 이것을 빌드 시스템에 알려주는 수단은 매우 다양합니다.

중요한 점은 hi.cpp이어야하며 hi.h을 포함해야한다는 것입니다. 또한 번역 단위에 두 번 이상 포함 시키려면 include guardhi.h에 넣어야합니다. "C : \ \ hi.cpp C"대신이 헤더 파일에 더 읽기 보이는 것을 그 사실을 제외하고 아무 문제없이 헤더를 사용

+0

왜'hi.cpp는 hi.h를 포함해야합니까? ' 그것은이 포함없이 작동합니다. 귀하의 경우에 – vico

+0

@ user1501700은 중요하지 않지만 일반적으로 * 선언 *과 * 정의 *는 구분됩니다. 함수 또는 클래스 멤버 함수의 * 정의 *는 헤더에서 가져 오는 다른 선언을 알아야 할 수도 있습니다. – juanchopanza

2

나는 #INCLUDE 같은 CPP 파일을 포함 할 수 있습니다.

예, 그렇게 할 수는 있지만 권장되지 않습니다. 문제 중 하나는 캡슐화입니다. 당신은 구현 세부 사항을 숨기고 있지 않습니다.당신이 언급 한 가독성 또한 관심사이며, 헤더는 공개 된 방법을 명확하게 보여주기 때문에 읽기 쉽습니다. 내 메인 프로그램 hi.h에 샘플과 같은 헤더를 포함 할 경우

는 가 hi.cpp을 포함 hi.h해야하며, 자동으로 같은 파일 이름 안녕을 따라 수행된다. 컴파일러가 함수 fhi body가 어디 있는지 어떻게 알지 궁금하네요.

헤더를 hi.cpp 및 헤더에 정의 된 클래스를 사용하는 모든 .cpp 파일에 명시 적으로 포함시켜야합니다.

헤더 및 cpp 파일에 다른 이름을 사용할 수 있습니까?

네, 그렇지만 권장 사항이 아니기 때문에 사물을 찾기가 더 어려워집니다.

일반적으로 생각해 보면 다른 프로그래머가 코드를보고 싶을 수 있으므로 코드를 읽고 이해하기 쉽도록해야하며 2 년 후에는 더 쉽게 사용할 수 있도록 생각하십시오. 사물이 어디에 있는지 기억하십시오.

2

Visual Studio에서 프로젝트에 포함 된 모든 CPP 파일은 OBJ 파일을 생성하도록 컴파일됩니다. 이러한 OBJ 파일은 함께 연결되어 EXE 또는 DLL을 형성합니다.

파일을 포함시키는 것은 해당 위치에서 파일의 내용을 붙여 넣는 것과 비슷합니다. 유일한 차이점은이 붙여 넣기는 컴파일하는 동안 사전 컴파일러가 수행한다는 것입니다.

함수 본문이있는 곳을 찾는 것은 함수가 인라인 인 경우 컴파일러에서 수행하고 마지막 이진을 만들 때 링커에서 수행합니다. 헤더 파일을 포함하여 소스 파일과 같은 디렉토리에있는 경우

2

먼저, 당신은 단지

#include "hi.h" 

즉, 당신은 전체 경로를 사용하지 않아도 사용할 수 있습니다. (예 : "stdafx.h" 포함)

두 번째로, 헤더 파일에서 유형을 필요로하지 않는 한 다른 헤더 파일을 포함 할 필요가 없습니다. 헤더 파일에는 포함 된 헤더 파일에서 필요한 것이 없습니다.

셋째, 헤더 파일 헤더 파일이 동일한 소스 파일에 두 번 이상 포함되지 않도록 보호해야합니다. 이는 include guard이라는 특정 컴파일러에서 이라는 특수 지시문을 사용하여 수행 할 수 있습니다.

넷째, 헤더 파일에 전역 변수 var을 정의하십시오. 이 변수는 헤더 파일을 포함하는 모든 소스 파일에 정의되며, 이로 인해 오류가 발생할 수 있습니다. 당신은 extern로 변수를 선언해야합니다 당신은 지금처럼

extern int var; 

그런 다음 하나 개의 소스 파일에 당신은 변수를 정의합니다.

다섯째, 헤더 파일에 소스 파일을 포함하면 안됩니다. (특별한 예외는 있지만 아직 생각할 필요가 없습니다.) 대신 모든 소스 파일을 프로젝트에 추가하면 (Microsoft Visual Studio에 있다고 가정합니다) 모든 빌드가 자동으로 함께 수행됩니다.

여섯째, VisualC++을 사용하고있는 것 같기 때문에 아마도 precompiled headers이라는 것을 사용하고있을 것입니다. 이것은 컴파일러가 컴파일 속도를 높이기 위해 사용하는 것입니다. 그러나 이것이 작동하려면 모든 소스 파일에 "stdafx.h"을 포함시켜야합니다. 실제로는 각 소스 파일에서 첫 번째 주석이 아닌 행이 포함되어야합니다.