错误C1083:无法打开包含文件:';stdafx.h'; (C++程序设计语言第四版):< /P>

错误C1083:无法打开包含文件:';stdafx.h'; (C++程序设计语言第四版):< /P>,c++,visual-studio,visual-studio-2013,stdafx.h,C++,Visual Studio,Visual Studio 2013,Stdafx.h,main.cpp #包括 #包括 #包括 #包括“vector.h” 使用名称空间std; 双平方和(向量&); int _tmain(int argc,_TCHAR*argv[] { 向量v(6); 平方和(v); 返回0; } 双平方和(向量和v) { 双和=0; 对于(int i=0;i!=v.size();++i) 总和+=sqrt(v[i]); 回报金额; } vector.cpp #包括 #包括“vector.h” 向量::向量(int-s) :elem{new double[s]

main.cpp

#包括
#包括
#包括
#包括“vector.h”
使用名称空间std;
双平方和(向量&);
int _tmain(int argc,_TCHAR*argv[]
{
向量v(6);
平方和(v);
返回0;
}
双平方和(向量和v)
{
双和=0;
对于(int i=0;i!=v.size();++i)
总和+=sqrt(v[i]);
回报金额;
}
vector.cpp

#包括
#包括“vector.h”
向量::向量(int-s)
:elem{new double[s]},sz{s}
{
}
double&vector::运算符[](int i)
{
返回元素[i];
}
int vector::size()
{
返回sz;
}
向量h

#包括
类向量{
公众:
向量(int-s);
双重&运算符[](int i);
int size();
私人:
双*元素;
int sz;
};
它给了我这些错误:


我在Windows 7上的Microsoft Visual Studio 2013上运行它。如何修复它?

您必须正确理解什么是“stdafx.h”,也称为预编译头。其他问题或维基百科将回答这个问题。在许多情况下,可以避免预编译头,特别是当您的项目很小且依赖性很小时。在您的例子中,可能是从模板项目开始的,它仅用于
\u TCHAR
宏中的
Windows.h

然后,在Visual Studio world中,预编译头通常是每个项目的文件,因此:

  • 确保项目中有文件“stdafx.h”。如果您没有(例如,您删除了它),只需创建一个新的临时项目并从中复制默认项目
  • #include
    更改为
    #include“stdafx.h”
    。它应该是一个项目本地文件,而不是在include目录中解析

  • 第二:在您自己的头中包含预编译头是不可取的,因为它不会扰乱其他可以将您的代码用作库的源代码的名称空间,所以完全删除它在
    vector.h
    中的包含,只包含windows.h而不是stdfax,或者创建一个没有模板的干净项目。

    添加
    \35;包括“afxwin.h”
    在源文件中。它会解决你的问题

    有两种解决方案

    解决方案一: 1.重新创建项目。创建项目时,确保选中了预编译头(应用程序设置…***不要选中空项目)

    解决方案二: 1.在项目中创建stdafx.h和stdafx.cpp 2右键单击project->properties->C/C++->预编译头 3.选择要创建的预编译头(/Yc) 4.重建解决方案


    如果遇到任何问题,请向我发送消息。

    您可以通过添加“$(ProjectDir)”(或stdafx.h所在的任何位置)来解决此问题在Project->Properties->Configuration Properties->C/C++->General->Additional Include目录下列出目录。

    刚刚通过Visual Studio代码教程,遇到了类似的问题


    #include“stdafx.h”
    替换为
    #include“pch.h”
    ,这是预编译头的更新名称。

    启动项目的正确方式通常是99%的战斗。文件+新+项目,Visual C++,Win32,选择“Win32控制台应用程序”。现在,您有了一个stdafx.h文件,其中包含所有编译器设置,这些设置与使用预编译头功能的方式相同。如果这本书没有引导你走这条路,那么你应该另找一本。但是它可能是这样的。您在头文件
    vector.h
    中定义的所有方法都没有在主可执行文件中找到一个未实现的符号。确保您确实在编译
    vector.cpp
    。在visual studio中:确保
    vector.cpp
    位于“源文件”筛选器中(您将其视为文件夹)。或者将其删除并重新读取到项目中。@ceztko“在您自己的头中包含预编译头是不可取的,因为它不会使可以使用您的代码的其他源的命名空间混乱”。。。你确定吗?每个预编译的头文件都有一次
    #pragma
    ,因此只使用第一个,而忽略另一个(如
    vector.h
    ),不是吗?嗯,我的头文件中有stdafx.h会导致问题。此时库使用stdafx.h,但使用它的程序不使用,并且库不公开stdafx.h文件。是。这也应该是一个问题。一般来说,我担心stdafx.h公开的内容超出了链接库的实际需要,因此不必要地包含它会污染其他人的命名空间。我建议不要以文本形式包含stdafx.h。您可以通过msvc中的命令行args
    /FI
    执行此操作。这使你可以编译你的应用程序有和没有pch。。。对于clang和gcc,您也可以强制包含。我在“解决方案2”中创建了这些空文件,而在
    项目属性中
    ->
    预编译头
    保留为空-我没有选择
    创建(/Yc)
    。我重建了它,一切都很好。
    #include <stdafx.h>
    #include <iostream>
    #include <cmath>
    #include "vector.h"
    using namespace std;
    
    double sqrt_sum(vector&);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        vector v(6);
        sqrt_sum(v);
        return 0;
    }
    
    double sqrt_sum(vector& v)
    {
        double sum = 0;
        for (int i = 0; i != v.size(); ++i)
            sum += sqrt(v[i]);
        return sum;
    }
    
    #include <stdafx.h>
    #include "vector.h" 
    
    vector::vector(int s)
    :elem{ new double[s] }, sz{ s }
    {
    }
    double& vector::operator[](int i)
    {
        return elem[i];
    }
    int vector::size()
    {
        return sz;
    }
    
    #include <stdafx.h>
    class vector{
    public:
        vector(int s);
        double& operator[](int i);
        int size();
    private:
        double* elem;
        int sz;
    };