预编译头文件的最佳候选者是什么?我可以在那里放置STL和Boost标头,即使它们有模板吗?这会减少编译时间吗?另外,减少编译时间的最佳IDE设置是什么?
我有一个示例项目(不是我的)在Visual C++ 6中.我正在尝试将其转换为Visual Studio 2008.
旧项目使用预编译头.现在的问题是:
什么是预编译头文件?
由于旧项目使用预编译头.我还将在Visual Studio 2008(新项目)中使用它们.但我得到的错误是"你忘了包含stdafx.h",为了解决这个问题,我在每个源文件中加入了"stdafx.h".这非常有效.但是旧项目在每个文件中都没有包含"stdafx.h"?那么如何选择退出在每个源文件中包含"stdafx.h".因为不是每个源文件都需要"stdafx.h"中定义的包含文件,所以只有少数文件.怎么做的?
编辑: 如何使用预先设定的标题来解释某些文件?
我看到很多代码,包括stdafx.h.说,我不想要预编译的标头.我将手动包含所有必需的系统头文件.在那种情况下,还有其他任何理由我应该知道我需要的地方stdafx.h吗?
这是我的.pch文件 -
//
// Prefix header for all source files of the 'English Club' target in the 'English Club' project
//
#import <Availability.h>
#ifndef __IPHONE_4_0
#warning "This project uses features only available in iOS SDK 4.0 and later."
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "Helper.h"
#import "Animations.h"
#import "Constants.h"
#import "SoundPlayer.h"
#import "UAirship.h"
#import "UAStoreFront.h"
#import "UIIMagesNames.h"
#import "UIView+Sizes.h"
#import "HelpButton.h"
#import "SoundPlayer.h"
#import <RestKit/RestKit.h>
#import "UIHelpSoundFiles.h"
#endif
Run Code Online (Sandbox Code Playgroud)
仍然很常见,Xcode会给我错误,他找不到那些类.(例如帮助者).问题是该项目将被编译并且工作正常,但是我有数百个错误,这些错误会扰乱我寻找真实的错误.
知道为什么吗?
预编译的标题似乎可以在大型项目中节省大量时间,但似乎也是一个有点陷阱的痛苦.
使用预编译头文件的优点和缺点是什么,特别是因为它适用于在Gnu/gcc/Linux环境中使用它们?
我理解预编译头文件的目的和原因.但是,实施它们的规则是什么?根据我的理解,它是这样的:
这是对的吗?您是否应该将其包含在预编译头文件中包含的文件中?目前,在遵循我的直觉时,我得到以下编译错误:
错误C2857:在源文件中找不到使用/Ycstdafx.h命令行选项指定的'#include'语句
命令行选项如下:
/ Od/I"../External/PlatformSDK/Include"/ I".."/ I"../External/atlmfc/Include"/ D"_DEBUG"/ D"_UNICODE"/ D"UNICODE"/ Gm/EHsc/RTC1/MDd /Yc"stdafx.h"/Fp"....Output\LudoCore\Debug\LudoCore.pch"/ Fo"....\Output\LudoCore\Debug \"/ Fd".. ..\Output\LudoCore\Debug\vc80.pdb"/ W4/WX/nologo/c/ZI/TP/wd4201/errorReport:prompt
c++ visual-studio-2005 include precompiled-headers visual-c++
我目前正在将一个大型RAD Studio 2010项目迁移到XE4.作为其中的一部分,我正在重新创建许多项目文件.我想借此机会确保我们使用最佳的预编译头文件机制,因为似乎有几种方法可以做到这一点.
现在我们只编译32位,但将来会使用64位编译器.
以下是我们目前在2010年所做的工作,以及为什么我不确定在XE4中要做什么:
我们有一个文件PchApp.h,其中包含<vcl.h>许多其他常用的头文件,主要是项目中各种常用核心类的头文件.此标头包含在每个CPP文件的顶部,后跟#pragma hdrstop如下所示:
// Top of .cpp file
#include "PchApp.h"
#pragma hdrstop
// Normal includes here
#include "other.h"
#include "other2.h"
// etc
Run Code Online (Sandbox Code Playgroud)
然后,我们在项目选项的预编译标题部分中进行以下设置:

编译起来并不是特别快(大约350,000行代码需要12分钟.)我不确定:
换句话说,我不确定这些是正确的还是最佳的设置,但是从阅读文档中我同样不确定什么会更好.我知道我不太了解所有选项 - 这个问题的一个原因:)
XE4 32位编译器的选项对话框是相同的,但有两件事让我感到困惑和/或让我不确定当前的2010方法是最好的.
1.默认行为
在创建新的VCL Forms项目时,IDE会创建一个默认名为Project1PCH1.h的标头,该标头旨在作为项目的预编译标头. 此标头包含<vcl.h>和<tchar.h>,并在项目管理器中显示为节点.它不包含在默认的Form1.cpp中,但#include <vcl.h>后面#pragma hdrstop是Form1.cpp的最顶层,后跟其他标题.
使用此标题的新项目的默认XE4设置对话框是:

我(天真地?)正在假设默认值实际上是最佳/最佳设置.有些事情困扰我:
Project1PCH1.h在任何地方的预编译头设置中都没有提到项目的假定预编译头.Project1PCH1.h?)Project1PCH1.h …我在C项目中使用预编译的头文件,但我们正在将.CPP文件集成到项目中.
这是错误:
Error 1 fatal error C1853: 'Debug\MuffinFactory.pch' precompiled header
file is from a previous version of the compiler, or the precompiled header is C++
and you are using it from C (or vice versa)
c:\users\blake\desktop\projects\muffinfactory\source\main.cpp 1
Run Code Online (Sandbox Code Playgroud)
我们只需要在我们的项目中编译一个.CPP,但我们确实需要预编译的头来节省编译时间(Windows.h等).
我应该如何组织我的项目呢?
foo.cpp(33918) : fatal error C1854: cannot overwrite information formed
during creation of the precompiled header in object file: 'c:\somepath\foo.obj'
Run Code Online (Sandbox Code Playgroud)
咨询MSDN关于这一点给了我以下信息:
在为同一文件指定/ Yc(创建预编译头)选项后,指定了/ Yu(使用预编译头)选项.某些声明(例如声明包括__declspec dllexport)使其无效.
在这种情况下,我们使用dllexport和预编译头文件.有没有人遇到过这个并且知道任何解决方法?非常感谢任何有关这个问题的信息.
谢谢
我最近切换到Visual Studio 2010,而Intellisense在使用boost库时不需要花半分钟时间显示,Microsoft的建议似乎使用了预编译的头文件.
除了我之前从未使用过它们(除非被Ugly ATL Wizards(TM)强迫),所以我四处寻找它们是如何工作的.
基本上,大集中stdafx.h方法似乎是完全错误的.我从不想在所有来源中包含(甚至便宜)一大堆头文件.由于我不使用Windows库(我使用C++/CLI更高级别的包装器,然后使用.NET与外界交谈),我没有"一整套不变的巨大标头".正好boost和标准的库标题分散在各处.
有一个有趣的方法解决这个问题,但我无法弄清楚如何使这项工作.似乎每个源文件必须编译两次(如果我错了,请纠正我):一次使用/ Yc,一次使用/ Yu.这增加了开发人员的负担,必须手动调整构建系统.
我希望找到一些"为每个源文件自动生成一个预编译的头文件"技巧,或者至少是一些"最佳实践",但大多数人似乎都乐于将这个世界纳入其中stdafx.h.
我可以在每个源文件的基础上使用预编译头文件有哪些选项?我并不真正关心构建时间(只要它们不会飙升),我只想让intellisense 快速工作.
c++ ×7
visual-c++ ×4
c ×1
c++builder ×1
dllexport ×1
gcc ×1
header ×1
header-files ×1
include ×1
linux ×1
objective-c ×1
stdafx.h ×1
visual-c++-6 ×1