2014-11-27 3 views
0

나는 세 개의 파일 (미리 컴파일 된 헤더 제외)이있는 간단한 프로그램을 가지고 있습니다.미리 컴파일 된 헤더 오류

1> D : \ 연습 \ 연산자 오버로딩 \ oopinheritance \ oopinheritance \ commisionemp.h ( 나는 내가 이해하지 못하는 것 같습니다 아직이 두 가지 오류를주고있다 .CPP 파일의 미리 컴파일 된 헤더를 포함했다 4) : 경고 C4627 : '#include': 미리 컴파일 된 헤더를 사용할 때 건너 뜁니다. 1 'StdAfx.h'에 지시문을 추가하거나 미리 컴파일 된 헤더를 다시 작성하십시오. 1> d : \ practice \ operatoroverloading \ oopinheritance \ oopinheritance \ commisionemp.h (35) : 치명적인 오류 C1010 : 미리 컴파일 된 헤더를 찾는 동안 예기치 않은 파일 끝. 원본에 '#include "StdAfx.h"'를 추가하는 것을 잊었습니까? ========== 모두 다시 빌드 :

OOPInheritance.cpp 

     // OOPInheritance.cpp : Defines the entry point for the console application. 
     // 

     #include "stdafx.h" 
     #include <iostream> 
     #include <iomanip> 
     #include "CommisionEmp.h" 

     using namespace std; 

     int _tmain(int argc, _TCHAR* argv[]) 
     { 
      CommissionEmp employee("Dede","Kikadi","777-77-7777",5000,0.08); 

      cout<<fixed<<setprecision(2); 

      cout<<"Employee information obtained by get functions:\n" 
       <<"\n First name is" <<employee.getFirstName() 
       <<"\n Last name is "<<employee.getLastName() 
       <<"\nSocial security number is" 
       <<employee.getSocialSecurityNumber() 
       <<"\nGross sales is " <<employee.getGrossSales() 
       <<"\nCommission rate is " <<employee.getCommissionRate()<<endl; 

      employee.setGrossSales(8000); 
      employee.setCommissionRate(.1); 

      cout<<"\n Updated employee infromation output by print function : \n"<<endl; 
      employee.print(); 

      cout<<"\n Employee's earning : ZAR"<<employee.earnings()<<endl; 
      return 0; 
     } 

CommisionEmp.h: 

     #ifndef COMMISSION_H 
     #define COMMISSION_H 

     #include <string> 
     using namespace std; 

     class CommissionEmp{ 
     public: 
      CommissionEmp(const string &, const string &, const string &, double=0.0, double =0.0); 
      void setFirstName(const string &); 
      string getFirstName() const; 

      void setLastName(const string &); 
      string getLastName() const; 

      void setSocialSecurityNumber(const string &); 
      string getSocialSecurityNumber() const; 

      void setGrossSales(double); 
      double getGrossSales() const; 

      void setCommissionRate(double); 
      double getCommissionRate() const; 

      double earnings()const; 
      void print() const; 
     private: 
      string firstName; 
      string lastName; 
      string socialSecurityNumber; 
      double grossSales; 
      double commissionRate; 
     }; 
     #endif 

CommissionEmp.cpp: 

     #include "stdafx.h" 
     #include <iostream> 
     #include "CommisionEmp.h" 

     using namespace std; 

     CommissionEmp::CommissionEmp(const string &first, const string &last, const string &ssn, double sales, double rate) : 
     firstName(first), lastName (last), socialSecurityNumber(ssn) 
     { 
      setGrossSales(sales); 
      setCommissionRate(rate); 
     } 

     void CommissionEmp::setFirstName(const string &first) 
     { 
      firstName=first; 
     } 
     string CommissionEmp::getFirstName()const {return firstName;} 

     void CommissionEmp::setLastName (const string &last) 
     { 
      lastName=last; 
     } 
     string CommissionEmp::getLastName()const {return lastName;} 

     void CommissionEmp::setSocialSecurityNumber (const string &ssn) 
     { 
      socialSecurityNumber=ssn; 
     } 
     string CommissionEmp::getSocialSecurityNumber()const {return socialSecurityNumber;} 

     void CommissionEmp::setGrossSales (double sales) 
     { 
      if(sales >= 0.0) 
       grossSales=sales; 
      else throw invalid_argument("Gross sales must be >=0.0"); 
     } 
     double CommissionEmp::getGrossSales()const {return grossSales;} 

     void CommissionEmp::setCommissionRate (double rate) 
     { 
      if(rate>0.0 && rate <1.0) 
       commissionRate=rate; 
      else throw invalid_argument("Commission rate must be > 0.0 and < 1.0"); 
     } 
     double CommissionEmp::getCommissionRate()const {return commissionRate;} 
     double CommissionEmp::earnings() const{ 
     return commissionRate*grossSales; 
     } 
     void CommissionEmp::print() const{ 
      cout<<"commission empoyee: " <<firstName <<' ' <<lastName 
       <<"\n social security number : "<<socialSecurityNumber 
       <<"\ngross sales: "<< grossSales 
       <<"\ncommission rate: "<<commissionRate; 
     } 
+1

오류 메시지가 commisionemp.h에 대해 이야기하지만 그 파일 중 아무 것도 그 파일을 호출하지 않습니다. –

+0

@MatsPetersson Peterson, 죄송합니다. 파일 이름을 입력했습니다. – panto111088

답변

1

미리 컴파일 된 헤더 : 0은 코드입니다 1, 실패 0 ==========

여기

를 생략 성공 VS에서 이런 식으로 작업합니다 (내가 사용하는 일반 이름을 발명 했으므로 검색을 시도하지 마십시오).

헤더 파일을 가져옵니다. 기본적으로 프로젝트 마법사는 stdafx.h (정말 바보 같은 역사적인 이름)를 호출합니다. 거기에 거의 모든 것을 포함시키는 것을 넣으십시오. 이 헤더는 pch 소스 헤더입니다.

"미리 컴파일 된 헤더 사용"플래그를 "사용"으로 설정하고 "미리 컴파일 된 헤더"플래그를 원본 소스 헤더로 설정하여 프로젝트를 구성하십시오.

pch 소스 헤더를 포함하는 것을 제외하고는 비어있는 소스 파일을 가져옵니다. 일반적으로 .cpp가 끝나는 헤더와 동일하게 호출되므로 마법사는 stdafx.cpp를 호출합니다. 이것은 pch 참조 파일입니다.

pch 참조 파일에 대해 "미리 컴파일 된 헤더 사용"플래그를 "작성"으로 덮어 씁니다.

컴파일러는 이제 참조 파일을 컴파일하고 내부 상태를 파일에 저장합니다. 결과는 .pch 파일입니다. 컴파일러는 나중에 내부 상태를 저장된 상태로 복원하고 거기에서 계속 진행할 수 있습니다.

다른 모든 파일에서 컴파일러는 pch 소스 헤더에 #include 지시문을 검색하여 다른 코드를 찾으면 경고를 표시합니다. 지시문을 찾으면 .pch에서 상태를 복원하고 거기에서 정상 컴파일을 계속합니다. 상태 복원 조작은 기존의 내부 상태를 겹쳐 쓰 G로 include 지시문 이전에 아무 것도 올 수 없습니다.

include 지시문이 누락되면 치명적인 오류가 발생합니다. 그리고 stdafx.cpp가 올바르게 구성되어 있지 않아서 include 지시문이 존재하지만 .pch 파일을 찾을 수 없으면 오류가 있다고 판단하여 동일한 결과가 발생합니다. 는 MS 컴파일러의 작동 방식에 대한 매우 구체적인, 그리고 성가신 다른 컴파일러에 이식 할 수 있기 때문에 물론


은 그대로 시스템은 바보입니다. (당신은 기본적으로 당신이 원하는 것보다 더 많은 것을 가져 오는 모든 소스 파일에 쓸데없는 헤더를 가지고있다.) 그것은 또한 새로운 소스 파일을 생성 할 때마다 stdafx.h를 포함하는 것을 잊어 버린다는 것을 의미한다. #include "stdafx.h"지시문을 모두 제거하십시오. 프로젝트 옵션의 C/C++ -> 고급에서 stdafx.h를 강제 포함 파일로 설정하십시오. 이제는 모든 소스 파일의 시작 부분에 암시 적 #include 지시문이 있으므로 잊지 않고 다른 컴파일러와 간섭하지 않습니다.

그리고 여기있는 동안 pch 파일의 이름을 변경하십시오. projectname_pch.h/cpp를 사용하고 싶습니다.

+0

감사합니다 @ 세바스찬 Redl – panto111088

관련 문제