6

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

删除包含行是必须的吗?如果您有数百个文件并从 Win7 上的 Visual Studio 更改为 Linux 上的 Code::Blocks 或使用 Mac 将其交给其他人会怎样?

4

5 回答 5

11

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

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

(实际上,PCH 是一种解决 C++ 低效编译和链接模型的方法,可惜我们需要手动维护它……哎呀,亵渎神明。)

但这也意味着 - 只要您的内容与stdafx.hgcc 兼容 - 使用 CodeBlocks 进行编译仍然可以工作,但不会立即获得性能优势。

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

于 2011-03-10T18:21:14.020 回答
4

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

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

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

该教程的意思可能是stdafx.h通常包含一些特定于 Windows 的标头,而在其他平台上不存在。虽然有可能,但它确实与stdafx.h它本身毫无关系。显然,如果你在其他平台上编译你的程序,你不应该尝试包含任何 Windows 头文件,不管你是怎么做的:通过stdafx.h或其他地方。

于 2011-03-10T18:28:36.117 回答
1

据我所知stdafx.h,这是一个仅限 Windows 的文件(用于预编译的头文件):如果您不将其注释掉,您的代码将无法编译。

于 2011-03-10T18:17:56.287 回答
1

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

于 2011-03-10T18:19:54.413 回答
1

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

其他编译器通常会想要提取数据。但它不应该被注释掉。通常,您将能够调整您的编译器,以利用预编译的头文件功能来提高编译速度。有了gcc这个-pch选项就可以完成。使用代码块,我可以找到这个 wiki。预编译的头文件并不邪恶,相反,如果理解和使用得当,它们将为您节省宝贵的时间。

于 2011-03-10T18:24:41.383 回答