预编译头错误

时间:2014-11-27 08:09:09

标签: c++ visual-c++

我有一个包含三个文件的简单程序(不包括预编译的头文件)。 我在.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;
        }

1 个答案:

答案 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。