stdafx.h 如何实现跨平台且无故障?

6

嘿,我最近几天一直在跟进learncpp.com的教程,他们说要在Code::Blocks的.cpp文件中注释掉“#include "stdafx.h"”。

这是必须的吗?如果你有数百个文件,并从Win7的Visual Studio更改为Linux上的Code::Blocks或将其移交给其他人使用Mac,会发生什么情况?


1
如果你不注释掉它会发生什么?你试过了吗? - Nick
5个回答

11

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

这个特性非常有用,因为在大多数项目中,大量的头文件(标准库、系统头文件、共享的项目级别定义)被几乎所有的翻译单元(cpp)使用,因此使用PCH在编译期间带来了巨大的性能提升。

(实际上,PCH是一种解决C++编译和链接模型低效的hack技术,我们需要手动维护它有些遗憾...哎呀,说错话了!)

但这也意味着只要你的stdafx.h的内容与gcc兼容,使用CodeBlocks进行编译应该仍然有效,但不会立即获得性能提升。

由VS'应用程序向导生成的stdafx.h不能直接在其他平台上使用——通常包括Windows.h。因此,为了使它能够正常工作,需要使用适当的#ifdef/#endif对Windows特定的定义进行保护,在Linux或Mac特定的代码区域也需要做同样的处理。


我的VS2010没有包含一个叫做windows.h的文件,它只添加了targetver.h、stdio.h和tchar.h。否则,我应该可以将我所做的任何东西发送给我的Ubuntu朋友,没问题吧? - iarp
只是试一下 - 它基本上只是一个带有特殊名称的头文件,就像上面提到的一样。 在使用格式字符串或不同的字符串函数时,更可能遇到其他兼容性问题。 - Mario

4
不,那个教程的建议毫无意义。stdafx.h根本不会破坏任何东西。Visual Studio编译器中的预编译头系统是有意设计成这样的。
如果您的编译器支持预编译头文件(并遵循与Visual Studio相同的预编译方法),它可以使用stdafx.h进行预编译。
如果您的编译器不支持预编译头文件(或使用了不同的预编译方法),那么stdafx.h将被解释为普通的头文件,与任何其他头文件没有区别,并且与任何其他头文件一样处理。
可能那个教程所说的是stdafx.h经常包含一些Windows特定的头文件,在其他平台上不存在。虽然这是可能的,但这实际上与stdafx.h本身无关。显然,如果您在其他平台上编译程序,无论是通过stdafx.h还是其他地方,都不应尝试包含任何Windows头文件。

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

1

如果您实际上没有使用预编译头文件(PCH),我建议进入Visual Studio的选项/首选项->预编译头文件并将其关闭。如果您尝试删除它们并仍然使用Visual Studio,则会出现大量错误。


1
唯一需要做的就是将包含stdafx.h(或预编译头文件)的路径添加到默认的包含路径列表中。这是必需的,因为MS编译器实际上会用预编译数据替换#include "stdafx.h",而不是真正查找头文件。
其他编译器通常会想要引入数据。但最好不要注释掉它。通常,您可以调整编译器以利用预编译头文件功能来加速编译。对于gcc,可以使用-pch选项完成此操作。对于Code Blocks,我可以找到this wiki。预编译头文件并不邪恶,相反,如果理解和适当使用,它们将节省您宝贵的时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接