2013-11-03 7 views
0

Person.h헤더가 누락 된 #include로 컴파일되는 이유는 무엇입니까?

#ifndef PERSON_H_ 
#define PERSON_H_ 

/* Person.h */ 

class Person { 
    int age; 
    std::string name; 

    public: 
    Person(int, std::string); 
    std::string getName(); 
    int getAge(); 

}; 

#endif /* PERSON_H_ */ 

사람 (INT 표준 : : 문자열) 함수 선언은 표준 : : 문자열 이름을 사용, 아직 내가 헤더 파일에 포함하지 않았습니다. 따라서 필자는 컴파일러가 누락 된 심볼에 대해 불평 할 것으로 기대합니다. 그러나 컴파일되고 잘 실행됩니다! 왜?

코드의 나머지 ...

Person.cpp

#include <string> 
#include "Person.h" 

Person::Person(int age, std::string name) 
{ 
    this->name = name; 
    this->age = age; 
} 

std::string Person::getName() 
{ 
    return this->name; 
} 

int Person::getAge() 
{ 
    return this->age; 
} 

하여 Main.cpp 또한

#include <string> 
#include "Person.h" 

int main() { 

    printFunc(); 

    Person chelsea_manning(5, std::string("Chelsea Manning")); 

} 

, 정말 날 경우 알려 주시기 바랍니다, ++ C에 새로운 오전 당신은 내 코드/OOP에 이상한 것을 본다.

+5

포함은 복사 붙여 넣기와 같습니다. cpp가 할 수있는 순서대로 헤더를 복사하여 붙여 넣는 것을보십시오. – chris

+1

main.cpp와 person.cpp 둘 다에서'#include '을 제거하고 무슨 일이 일어나는 지보십시오.). – mfontanini

+1

포함 순서의 역순으로 시도하십시오 – tay10r

답변

4

main 함수를 포함하는 파일의 맨 위에서 프로그램 컴파일이 시작됩니다. 기술적으로 프로그램 전 컴파일러는 프로그램이 컴파일되기 전에 실행되지만 여전히 같은 위치에서 시작됩니다. 귀하의 경우, 그 파일에 <string>이 포함됩니다. 그런 다음 Person.h을 포함합니다. <string>이 이미 포함되어 있기 때문에 문자열 파일의 모든 내용이 코드의 person 파일보다 앞서고 모든 것이 올바른 순서로 선언됩니다. Person.h<string> 앞에 포함 시키거나 주 파일에 포함시키지 않으면 실제로 컴파일 오류가 발생합니다.

#include 방향은 복사/붙여 넣기와 같습니다 : 이것은 문자 그대로 <string> 파일을 읽고 그 내용을 포함 된 소스 파일로 씁니다. 다음은 Person.h에 대해서도 마찬가지입니다. 따라서 전 처리기를 실행 한 후 최종 결과는

<-- contents of <string> --> 
<-- contents of Person.h --> 

int main() 
... 

예를 들어, 모든 것이 올바른 순서로 선언됩니다.

+0

조금 더 정확하기 위해, 컴파일은''을 포함하지 않습니다. 전처리가 있습니다. –

+0

@ChrisHayes 예. 그것을 수정했습니다. – ApproachingDarknessFish

+0

을 Person.h 헤더 파일에 #include하는 것이 가장 좋습니다. 아니면 코드를 "복제"하는 것이 좋지 않습니까? 마찬가지로 Person.cpp에 # 을 #include하는 것은 "나쁘다"는 것입니다 (이미 main에 정의되어 있습니다). 다시 말해, main 함수를 사용하여 파일의 모든 것을 정의하지 않는 이유는 무엇입니까? #include 지시어를 언제, 어디서, 몇 번 사용해야하는지 혼란 스럽습니다. –

관련 문제