【问题标题】:Compiling requires to #include "stdafx.h"编译需要#include "stdafx.h"
【发布时间】:2015-05-25 21:19:51
【问题描述】:

我刚开始使用 Visual Studio 2013。直到我开始将 #include "stdafx.h" 放在每个 cpp 文件的开头,我的代码才会编译。当其他人通过Linux终端编译我的代码时,这会导致任何问题吗?如果我只是从以下代码中删除#include "stdafx.h",它会用 g++ 编译 C++11 吗?

#include "stdafx.h"
#include<iostream>
using std::cout; using std::endl; using std::cin;
using namespace std;

int main()
{
    cout << "This is an awesome game to play with your friends!"
        << endl << "You have to pick an integer between 10 and 49 and type it in"
        << endl << "Then your friend has to pick an integer between 50 and 99 and type it in."
        << endl << "Through a series of highly advanced calculations starting with their number,"
        << endl << "They regenerate your original number. Have fun!"
        << endl << ""
        << endl << "Please enter your integer number, between 10 and 49:";


    int your_int, their_int, factor, sum, calculation, result;

    cin >> your_int;
    factor = 99 - your_int;
    cout << "Factor: " << factor
        << endl << "Now, please enter your friend's integer number between 50 and 99:";
    cin >> their_int;
    sum = factor + their_int;
    calculation = sum / 100 + sum % 100;
    result = their_int - calculation;
    cout << "The sum is: " << sum
        << endl << "The calculation is : " << calculation
        << endl << "The result is :" << result
        << endl << "My answer was: " << your_int
        << endl << "Your result was: " << result;

    return 0;
}

【问题讨论】:

  • 这完全取决于stdafx.h 的内容。当你尝试它时会发生什么?添加包含之前的错误消息是什么?
  • 我的导师使用 Linux 使用 g++ 进行编译。我的 PC 上的 Linux 一直存在问题。所以我一直在使用 Visual Studio 2013。我

标签: c++ visual-studio c++11


【解决方案1】:

预编译的头文件:它们是什么?

这里似乎对stdafx.h 有一些误解。首先,它只是一个头文件,它的内容和名称都没有任何特殊之处(见下文)。

在 Visual Studio 中使用预编译头文件时,默认情况下使用 stdafx.hstdafx.cpp 来完成此操作。

预编译头文件是一种加快编译速度的方法,通过将经常使用且很少更改的头文件“预编译”到一个包中;然后可以在编译项目中的每个文件时使用这个包。它主要包含各种定义。

为了能够使用预编译的头文件,出于语言技术的原因,这需要成为每个源文件中的第一段代码。因此,当您使用预编译头文件时,每个源文件的第一行代码必须包含此共享头文件。如果不是这种情况,头文件之前的预处理器宏定义可能会从根本上改变包含文件的解析方式,从而使预编译的头文件“无效”。

现在回到 Visual Studio,您希望在所有文件之间共享的所有标题和定义(例如 windows.h、STL 标题等)包含在 stdafx.h 中。 stdafx.cpp 只是编译器的一个帮助文件,它用于实际生成 pch 文件;作为用户,您永远不会接触此文件。

回答您的问题

现在回答你的问题:

选项 1 只要您坚持 C++11 标准并使用可移植代码,在 stdafx.h 和其他任何地方,将其作为第一个标题包含在任何地方都没有问题。 当您使用 Visual Studio 时,您可以使用预编译的头文件,任何 Linux 环境都会将其视为另一个头文件。 事实上,其他编译器也具有预编译的头文件,当提供正确的构建标志时,它们将能够直接使用stdafx.h

选项 2 您可以在项目属性表中禁用预编译头文件,在 C/C++ 的 Precompiled Headers 下,您可以将 Precompiled Header 从 Use 设置为 Not Using Precompiled Headers。不要忘记对 Debug 和 Release 配置执行此操作。关闭此选项后,您不再需要将stdafx.h 添加到任何文件中。我发现 IntelliSense 在使用预编译头文件时效果最好,因此我通常更喜欢保留它们,即使是在小型项目中也是如此。

关于stdafx.h 的更多信息

如前所述,stdafx.h 并不特别。 Visual Studio 项目页面,C/C++,Precompiled Headers,说明了使用哪个文件名作为预编译头。文件stdafx.cpp 有一个特殊的属性页,它与该主题的其他文件不同。它是唯一将 Precompiled Headers 设置为 Create 而不是 Use 的文件,因此编译器就是这样知道哪个是帮助文件。

完全可以使用不同的名称,甚至是多个预编译的头文件;它只需要在属性页中进行一些额外的配置。

【讨论】:

  • 非常感谢您的详细回答。这很有趣,因为你为我提供的帮助比我的导师每学分 400 美元还免费……哈哈。无论出于何种原因,我的 TA 说 stdafx.h 头文件不在 g++ 中。所以,你会得到一个编译错误,说“没有这样的文件或目录”。话虽如此,我想我会选择选项 2。再次感谢。
  • 不客气。如果您选择选项 1,那么您当然必须将 stdafx.h 与您的其他代码文件一起复制,就像您复制任何其他文件一样。真的只是一个普通的头文件。
【解决方案2】:

是的#include "stdafx.h" 会给任何试图在 Linux 系统上编译您的代码的人带来问题。

stdafx.h 是 Visual Studio 提供的非标准标头。它包含用于其他几个标准头文件的#include 指令。我想,这个想法是避免输入标准标题名称。

Linux 系统不提供这样的头文件。

如果您希望您的代码具有可移植性,您需要找出要在程序中包含哪些标准头文件。

没有看到您的程序,就不可能知道您需要哪些标头。

您可以编写自己的"stdafx.h" 文件,或复制Visual Studio 生成的版本,但这样做没有多大意义。恕我直言,最好直接包含您需要的标准标题。

【讨论】:

  • stdafx.h 只是默认的预编译头文件名,默认为空。它没有什么特别之处,您也可以完全禁用它。
  • 它只是一个普通的.h文件,当你编写跨平台的C++代码时,它不包含任何“非标准”的东西。
  • @HansPassant:好的,但是文件本身的存在是非标准的。它强加了一种在 Linux 上完全可用的特定编码风格(将标准标头包装在单个实现创建的 .h 文件中),但恕我直言,风格很差。
  • G++ 和 Clang 也支持预编译头文件,它们的工作方式完全相同。当每个人都以同样的方式鼓励“糟糕的风格”以显着加快编译时间时,那么这种风格就会出现严重问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 2010-10-15
  • 2010-09-22
  • 2018-10-12
  • 2019-01-26
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多