首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译要求#包含"stdafx.h“

编译要求#包含"stdafx.h“
EN

Stack Overflow用户
提问于 2015-05-25 21:19:51
回答 2查看 5K关注 0票数 1

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

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-25 23:12:37

预编译头:它们是什么?

这里似乎有一些关于stdafx.h的误解。首先,它只是一个头文件,它的内容和名称在任何方面都不特殊(见下文)。

在Visual中使用预编译头时,默认情况下使用stdafx.hstdafx.cpp来完成这一任务。

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

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

现在回到Visual,您希望在所有文件之间共享的所有头和定义(例如,windows.h、share等)。您包括在stdafx.h中。stdafx.cpp只是编译器的一个助手文件,它用于实际生成pch文件;作为用户,您永远不会碰这个文件。

回答你的问题

现在回答你的问题:

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

选项2您可以在项目属性表中禁用预编译头,在C/C++下,可以将预编译头设置为从使用到不使用预编译标头。不要忘记为调试和发布配置都这样做。关闭此选项后,不再需要将stdafx.h添加到任何文件中。我发现,当使用预编译头时,IntelliSense工作得最好,因此,出于这个原因,我通常更喜欢将它们保留在小型项目中。

关于stdafx.h的其他信息

如前所述,stdafx.h并不特殊。Visual项目页C/C++预编译头显示要用作预编译头的文件名。文件stdafx.cpp有一个特殊的属性页,与有关此主题的其他文件不同。它是唯一将预编译头设置为创建而不是使用的文件,因此编译器知道哪个是助手文件。

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

票数 5
EN

Stack Overflow用户

发布于 2015-05-25 21:29:01

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

stdafx.h是Visual提供的非标准标头.它包含其他几个标准标头的#include指令。我想,这样做是为了避免输入标准的标头名称。

Linux系统不提供这样的头。

如果您希望代码是可移植的,则需要找出程序中包含哪些标准标头。

如果不看你的程序,就不可能知道你需要哪些头。

您可以编写自己的"stdafx.h"文件,也可以复制Visual生成的版本,但是这样做没有多大意义。更好的是,IMHO,仅仅包括您直接需要的标准标头。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30446151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档