我有一个包含三个文件的简单程序(不包括预编译的头文件)。 我在.cpp文件中包含了预编译的头文件 然而,它给出了我似乎无法理解的这两个错误:
1> d:\ practice \ operatoroverloading \ oopinheritance \ oopinheritance \ commisionemp.h(4):警告C4627:' #include':在查找预编译的头文件时跳过 1 GT;添加指令到' StdAfx.h'或者重建预编译的头文件 1> d:\ practice \ operatoroverloading \ oopinheritance \ oopinheritance \ commisionemp.h(35):致命错误C1010:查找预编译头时意外结束文件。您是否忘记添加' #include" StdAfx.h"'你的来源? ==========重建全部: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;
}
答案 0 :(得分:1)
VS中的预编译头像这样工作(我发明了我使用的通用名称,所以不要尝试谷歌搜索它们):
拿一个头文件;默认情况下,项目向导会将其命名为stdafx.h(一个非常愚蠢的历史名称)。把你所包含的东西放在那里。此标头是pch源标头。
通过将“使用预编译标头”标志设置为“使用”并将“预编译标头”标志设置为pch源标头来配置项目。
获取一个空的源文件,除了包含pch源头之外;通常称为与.cpp结尾的标题相同,因此向导将其称为stdafx.cpp。这是pch参考文件。
将pch参考文件的“使用预编译标题”标记覆盖为“创建”。
编译器现在将编译引用文件,并将其内部状态保存到文件中;结果是.pch文件。编译器稍后可以将其内部状态恢复到已保存状态并从那里继续。
在所有其他文件中,编译器将扫描pch源头的#include指令,如果找到任何其他代码则发出警告。当它找到该指令时,它从.pch恢复其状态并从那里继续正常编译。因为状态恢复操作会覆盖任何现有的内部状态,所以在include指令之前不会出现任何内容。
如果缺少include指令,则发出致命错误。并且,根据您的错误判断,如果include指令存在,则会发生同样的情况,但是找不到.pch文件,可能是因为您没有正确配置stdafx.cpp。
当然,系统本身是愚蠢的,因为它对MS编译器的工作方式非常具体,并且使得移植到其他编译器很烦人。 (你在每个源文件中基本上都有一个无用的头文件,其引入的内容远远超出你想要的范围。)这也意味着每当你创建一个新的源文件而忘记包含stdafx.h时你就会遇到奇怪的错误。这是一种更好的方法:删除所有#include“stdafx.h”指令。在项目选项中,在C / C ++下 - &gt;高级,将stdafx.h设置为强制包含文件。现在每个源文件的开头都有一个隐含的#include指令,所以你不能忘记它,它不会干扰其他编译器。
当你在它时,重命名pch文件。我喜欢使用projectname_pch.h / cpp。