2014-11-27 4 views
0

У меня есть простая программа с тремя файлами (исключая предварительно скомпилированный заголовок). Я включил прекомпилированный заголовок в .cpp файлах Однако он дает эти две ошибки, которые я, кажется, не понимают:Ошибка предварительного скомпилированного заголовка

1> d: \ практика \ перегрузка операторов \ oopinheritance \ oopinheritance \ commisionemp.h (4): предупреждение C4627: «#include»: пропущено при поиске прекомпилированного использования заголовка 1> Добавить директиву в «StdAfx.h» или перестроить предварительно скомпилированный заголовок 1> d: \ practice \ operatoroverloading \ oopinheritance \ oopinheritance \ commisionemp.h (35): фатальная ошибка C1010: неожиданный конец файла при поиске прекомпилированного заголовка. Вы забыли добавить '#include "StdAfx.h" в свой источник? ========== Rebuild All: 0 удалось, 1 не удалось, 0 пропущено ==========

Вот коды:

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

Предкомпилированные заголовки в VS работают так (я изобрел общие имена, которые я использую, поэтому не пытайтесь использовать их для поиска в Google):

Возьмите файл заголовка; по умолчанию мастер проекта назовет его stdafx.h (действительно глупое историческое имя). Поместите вещи, которые вы включили почти везде. Этот заголовок является заголовком источника pch.

Настройте проект, установив флаг «Использовать предварительно скомпилированный заголовок» в флаг «Использовать» и «Предкомпилированный заголовок» в ваш заголовок источника pch.

Возьмите исходный файл, который пуст, за исключением включения заголовка источника pch; обычно называется тем же, что и заголовок с завершением .cpp, поэтому мастер вызывает его stdafx.cpp. Это файл ссылок pch.

Отмените флаг «Использовать предварительно скомпилированный заголовок» в «Создать» для файла ссылок pch.

Компилятор теперь скомпилирует ссылочный файл и сохранит его внутреннее состояние в файл; результатом является файл .pch. Компилятор может позже восстановить свое внутреннее состояние в сохраненное состояние и продолжить оттуда.

Во всех других файлах компилятор будет проверять директиву #include для заголовка источника pch, выдавая предупреждения, если он найдет какой-либо другой код. Когда он находит директиву, он восстанавливает свое состояние из .pch и продолжает обычную компиляцию оттуда. Поскольку операция восстановления состояния перезаписывает любое существующее внутреннее состояние, ничего не может произойти до директивы include.

Если директива include отсутствует, испустите фатальную ошибку. И, судя по вашей ошибке, то же самое происходит, если существует директива include, но нет .pch-файла, возможно, потому, что у вас нет правильно настроенной stdafx.cpp.


Конечно, система, как это глупо, потому что это очень специфический к тому, как MS компилятор работает, и делает портирование на другие компиляторы раздражающих. (У вас в основном есть бесполезный заголовок в каждом исходном файле, который тянет гораздо больше, чем вы хотите.) Это также означает, что вы получаете странные ошибки всякий раз, когда вы создаете новый исходный файл, и забудьте включить stdafx.h. Вот лучший способ сделать это: удалить все директивы #include «stdafx.h». В параметрах проекта в разделе C/C++ -> Дополнительно установите stdafx.h как принудительный файл include. Теперь в начале каждого исходного файла есть неявная директива #include, поэтому вы не можете забыть ее и не мешать другим компиляторам.

И пока вы на нем, переименуйте файл pch. Мне нравится использовать projectname_pch.h/cpp.

+0

Спасибо @Sebastian Redl – panto111088

Смежные вопросы