嘿,过去几天我一直在关注 learncpp.com tuts,他们说要从 Code::Blocks 的 .cpp 文件中注释掉“#include "stdafx.h"。
删除包含行是必须的吗?如果您有数百个文件并从 Win7 上的 Visual Studio 更改为 Linux 上的 Code::Blocks 或使用 Mac 将其交给其他人会怎样?
嘿,过去几天我一直在关注 learncpp.com tuts,他们说要从 Code::Blocks 的 .cpp 文件中注释掉“#include "stdafx.h"。
删除包含行是必须的吗?如果您有数百个文件并从 Win7 上的 Visual Studio 更改为 Linux 上的 Code::Blocks 或使用 Mac 将其交给其他人会怎样?
stdafx.h
是 Visual Studio 生态系统中用于预编译头文件的惯用名称。简而言之,它是一个常规的头文件,但是这个文件的内容将被编译一次,并被项目中的所有 cpp 文件重用。
这很有用,因为在大多数项目中,几乎所有翻译单元 (cpp) 都使用大量头文件(标准库、系统头文件、共享项目范围的定义),因此在编译期间使用 PCH 可以带来巨大的性能优势
(实际上,PCH 是一种解决 C++ 低效编译和链接模型的方法,可惜我们需要手动维护它……哎呀,亵渎神明。)
但这也意味着 - 只要您的内容与stdafx.h
gcc 兼容 - 使用 CodeBlocks 进行编译仍然可以工作,但不会立即获得性能优势。
由 VS的stdafx.h
应用程序向导生成的内容在其他平台上无法开箱即用 - 它通常包括Windows.h
. 因此,要使其正常工作,请使用适当的#ifdef/#endif
对保护 Windows 特定的定义,反之亦然,用于 Linux 或 Mac 特定的东西。
不,该教程建议没有任何意义。stdafx.h
根本不会破坏任何东西。Visual Studio 编译器中的预编译头文件系统是有意设计的。
如果您的编译器支持预编译头文件(并遵循与 Visual Studio 相同的预编译方法),它可以stdafx.h
用于预编译。
如果您的编译器不支持预编译头文件(或使用了不同的预编译方法),则将stdafx.h
其解释为普通头文件,与任何其他头文件没有区别,并以与任何其他头文件相同的方式处理。
该教程的意思可能是stdafx.h
通常包含一些特定于 Windows 的标头,而在其他平台上不存在。虽然有可能,但它确实与stdafx.h
它本身毫无关系。显然,如果你在其他平台上编译你的程序,你不应该尝试包含任何 Windows 头文件,不管你是怎么做的:通过stdafx.h
或其他地方。
据我所知stdafx.h
,这是一个仅限 Windows 的文件(用于预编译的头文件):如果您不将其注释掉,您的代码将无法编译。
如果您实际上没有使用预编译头文件 (PCH),我建议您进入Visual Studio's Options/Preferences->Precompiled Header
并关闭它们。如果您尝试删除它们并仍然使用 Visual Studio,您将收到大量错误。
唯一实际要做的就是在默认包含路径列表中包含包含 stdafx.h(或预编译头文件)的路径。这是必需的,因为 MS 编译器实际上将 替换#include "stdafx.h"
为预编译数据,而无需真正查找标头。
其他编译器通常会想要提取数据。但它不应该被注释掉。通常,您将能够调整您的编译器,以利用预编译的头文件功能来提高编译速度。有了gcc
这个-pch
选项就可以完成。使用代码块,我可以找到这个 wiki。预编译的头文件并不邪恶,相反,如果理解和使用得当,它们将为您节省宝贵的时间。