stdafx.h跨平台没有问题?

时间:2011-03-10 18:14:35

标签: c++ visual-studio cross-platform precompiled-headers stdafx.h

嘿,我在过去几天一直关注learncpp.com tuts,他们说要从.cpp文件中注释掉“#include”stdafx.h“Code :: Blocks。

是否必须删除包含行?如果您有数百个文件并从Win7上的Visual Studio更改为Linux上的Code :: Blocks,或者使用mac将其移交给其他人,会发生什么?

5 个答案:

答案 0 :(得分:10)

stdafx.h是用于Visual Studio生态系统中预编译头文件的惯用名称。简而言之,它是一个常规标题,但是该文件的内容将被编译一次并重用于项目中的所有cpp文件。

这很有用,因为在大多数项目中,几乎所有翻译单元(cpps)都使用了大量标题(标准库,系统标题,共享项目范围定义),因此在编译期间使用PCH会带来巨大的性能优势

(实际上,PCH是一个解决C ++低效编译和链接模型的黑客,我们需要手工维护它是一种耻辱......哎呀,亵渎。)

但这也意味着 - 只要你的stdafx.h的内容与gcc兼容 - 使用CodeBlocks进行编译仍然有效,但没有直接的性能优势。

VS'应用向导生成的stdafx.h在其他平台上无法正常使用 - 通常包含Windows.h。因此,要使其工作,请使用适当的#ifdef/#endif对保护特定于Windows的定义,反之亦然,以适用于Linux或Mac特定的内容。

答案 1 :(得分:4)

不,那个教程建议没有任何意义。 stdafx.h根本没有破坏任何东西。 Visual Studio编译器中的预编译头文件系统是有意设计的。

如果您的编译器支持预编译的头文件(并遵循与Visual Studio相同的预编译方法),它可以使用stdafx.h进行预编译。

如果您的编译器不支持预编译头(或使用不同的预编译方法),则stdafx.h被解释为普通头文件,与任何其他头文件没有区别,并以相同方式处理与任何其他头文件一样。

该教程的含义可能是stdafx.h通常包含一些特定于Windows的标题,而不存在于其他平台上。虽然有可能,但它实际上与stdafx.h本身无关。显然,如果您在其他平台上编译程序,则不应尝试包含任何Windows标头,无论您是如何操作的:通过stdafx.h或其他位置。

答案 2 :(得分:1)

据我所知stdafx.h是一个仅限Windows的文件(对于预编译的头文件):如果你没有注释掉它,你的代码将无法编译。

答案 3 :(得分:1)

如果您实际上没有使用预编译头(PCH),我建议进入Visual Studio's Options/Preferences->Precompiled Header并关闭它们。如果您尝试删除它们并仍然使用Visual Studio,则会出现大量错误。

答案 4 :(得分:1)

实际上唯一要做的是在默认包含路径列表中包含包含stdafx.h(或预编译头)的路径。这是必需的,因为MS编译器实际上用预编译的数据替换了#include "stdafx.h"而没有真正查找标题。

其他编译器通常会想要提取数据。但它不应该被注释掉。通常,您将能够调整编译器以使用预编译的头部功能来增强编译。使用gcc选项可以完成-pch。使用代码块,我可以找到this wiki。预编译的标题不是邪恶的,相反,如果理解和充分利用它们,它们将为您节省宝贵的时间。