错误 C1083: 无法打开包括文件: 'stdafx.h'

19

我编译这个程序(来自《C++程序设计语言第四版》)时:

main.cpp

#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;
}

vector.cpp

#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;
}

vector.h

:表示一个头文件名为 vector.h。
#include <stdafx.h>
class vector{
public:
    vector(int s);
    double& operator[](int i);
    int size();
private:
    double* elem;
    int sz;
};

我看到以下错误:

errors

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


10
开始一个项目时,选择正确的方式通常就是战斗的99%。选择 文件 + 新建 + 项目,Visual C++,Win32,然后选择“Win32 Console Application”。现在你有了一个stdafx.h文件,其中包含所有编译器设置,正好可以使用预编译头文件功能。如果书没有指导你这么做,那么你应该寻找另一本书。但是它很可能已经指导了你这样做。 - Hans Passant
6个回答

21
您需要正确理解什么是“stdafx.h”,也称为预编译头文件。其他问题或维基百科将回答这个问题。在许多情况下,可以避免使用预编译头文件,特别是如果您的项目很小且依赖关系很少。在您的情况下,由于您可能是从模板项目开始的,因此它被用于仅包含_TCHAR宏的Windows.h
然后,在Visual Studio世界中,预编译头文件通常是每个项目的文件,因此:
  1. 确保在您的项目中有文件“stdafx.h”。如果没有(例如您已删除它),只需创建一个新的临时项目并从那里复制默认项目;
  2. #include <stdafx.h>更改为#include "stdafx.h"。它应该是一个项目本地文件,而不是要在包含目录中解析。
其次:不建议在自己的头文件中包含预编译头文件,以避免使其他使用您的代码作为库的源的名称空间混乱,因此完全删除vector.h中的其包含。

1
在头文件 vector.h 中定义的所有方法都没有在主可执行文件中找到实现的符号。确保你真的在编译 vector.cpp。在 Visual Studio 中:确保 vector.cpp 在“源文件”筛选器中(你可以将其视为一个文件夹)。或者将其从项目中删除并重新添加。 - ceztko
1
@ceztko:“在您自己的头文件中包含预编译头文件是不可取的,以免混淆其他可能使用您代码的源名称空间”...您确定吗?每个预编译头文件都有#pragma once,因此只使用第一个,而其他文件(例如vector.h)会被忽略,不是吗? - Martin Pecka
1
嗯,我遇到了一个情况,我的头文件中包含stdafx.h会导致问题。当库使用stdafx.h,但是程序没有使用它,并且stdafx.h文件未被库公开时就会出现这种情况。 - Martin Pecka
1
是的,这也应该是一个问题。总的来说,我担心的是stdafx.h暴露了比链接库实际需要的更多内容,因此如果不必要地包含它,你会污染别人的命名空间。 - ceztko
我建议不要直接包含stdafx.h文件。你可以通过msvc的命令行参数/FI来实现。这样可以让你在编译应用程序时选择是否使用预编译头文件(pch)... 对于clang和gcc,你也可以强制包含某个文件。 - Bernd

12

只需包含 windows.h 文件而非 stdfax,或者创建一个没有模板的干净项目。


8
有两种解决方法。
第一种解决方法: 1.重新创建项目。在创建项目时,请确保勾选预编译头(应用程序设置... ***不要勾选空项目)。
第二种解决方法: 1.在您的项目中创建stdafx.h和stdafx.cpp文件。 2.右键单击项目 -> 属性 -> C/C++ -> 预编译头 3.选择要创建的预编译头(/Yc) 4.重新构建解决方案。
如果您遇到任何问题,请给我留言。

1
我在“方案二”中创建了这些空文件,并且在项目属性-> 预编译头文件中留空 - 我没有选择创建(/Yc)。我重新构建了它,一切都正常。 - Junior Mayhé

5
您可以通过将“$(ProjectDir)”(或者stdafx.h所在的目录)添加到“项目”->“属性”->“配置属性”->“C / C ++”->“常规”->“附加包含目录”的目录列表中来解决此问题。

4
在您的源文件中添加#include "afxwin.h"。这将解决您的问题。

1

我正在进行 Visual Studio Code 教程,遇到了一个类似的问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接