首先,我想说,我读过关于预编译头的文章,我知道这是一个优化,可以节省我在每个构建上反复编译头的时间。
我正在阅读boost的文档,我在说明中看到了这一点:
在配置属性> C/C++ >预编译头中,将使用预编译头(/Yu)更改为不使用预编译头
然后他们解释说:
在预编译头中使用Boost是没有问题的;这些指令只是避免预编译头,因为它需要对示例中使用的源代码进行特定于Visual的更改。
发布于 2014-01-19 22:23:53
最初是一个评论,但我也可以张贴它。注意:这是特定于VC++的:
1. Any system standard lib headers used by your project
2. 3rd-party SDK headers
3. Just about everything else that is NOT in active development for _your_ project.
标记为Create的单个源文件通常包含一行代码:#include "YourHeaderFile.h",其中YourHeaderFile.h是您填充了上面列表中的内容的标题。通过头文件将其标记为"Create“,YourHeaderFile.h告诉VC,在编译其他源文件时,它是通过该头重新构建PCH所需的文件。所有其他源文件都被标记为使用(除了关闭PCH的源文件),并且应该包含相同的#include "TheHeaderFile.h"作为其第一行代码。
简而言之(难以置信),<boost>告诉您它们的示例不像上面描述的那样设置,因此在构建它们时应该关闭它们。
发布于 2014-01-19 22:14:06
当使用预编译的头文件时,需要执行以下操作:
#include <foo>
#include <bar>
#include <baz>
#pragma hdrstop
// other code here#pragma之前的所有内容都进入预编译头。它之后的一切都取决于预编译的头。使预编译头工作的VC++特定的“魔力”是#pragma。
不过,这个故事的意义还不止如此。要使预编译的头正常工作,您需要在每个源文件中以完全相同的顺序包含完全相同的一组标头。
这导致(通常)创建一个包含所有其他公共标头并在其末尾具有#pragma hdrstop权限的头,然后将其包含在所有其他源文件中。
然后,当编译器完成它的工作时,有两个阶段:首先,您需要创建一个预编译的头。这意味着用一个开关运行编译器。编译器只查看#pragma hdrstop之前的内容,构建符号表(诸如此类),并将数据放入.pch文件。
然后是使用预编译头进行构建的阶段。在此阶段,编译器只需忽略文件中的所有内容,直到#pragma hdrstop。当达到这个目的时,它会从.pch文件中读取编译器的内部状态,然后开始编译这个单独的文件。
这意味着每个源文件通常都包含许多它实际上不需要的头部。反过来,这意味着如果不使用预编译的头文件,那么编译的速度要比没有做任何支持预编译头的工作要慢得多。
换句话说,尽管唯一绝对需要的部分是#pragma hdrstop (这是相当无害的),但是需要更多的文件重构才能从中获益--如果您使用的是不支持预编译头的内容,那么这些更改很可能会对编译时间造成很大的损害(就像VC++那样做的那样)。
发布于 2014-01-19 21:34:52
当预编译头出现在每个cpp源文件上时,必须以#include "stdafx.h“开头。
因此,如果您不想编辑所有的boost源文件,就会关闭它。
当预编译头在stdafx.cpp上时,“创建”预编译头。所有其他文件“使用”预编译头。
https://stackoverflow.com/questions/21222922
复制相似问题