日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】预编译头文件

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】预编译头文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.cnblogs.com/nzbbody/p/3437868.html

1、解決什么問題?

  C++ 編譯器是單獨、分別對每個cpp文件進行預編譯(也就是對#include,#define 等進行文本替換),生成編譯單元。編譯單元是一個自包含文件,C++編譯器對編譯單元進行編譯。考慮,頭文件A.h被多個cpp文件(比如A1.cpp,A2.cpp)包含,每個cpp文件都要進行單獨編譯,其中的A.h部分就會被多次重復的編譯,造成效率低。

2、怎么解決?

  把A.h以及類似A.h這樣的頭文件,包含到stdafx.h中(當然也可以是其他文件),在stdafx.cpp中包含stdafx.h,打開stdafx.cpp文件的屬性對話框,將屬性對話框中的"預編譯頭"設置為 “/Yc”即創建預編譯頭。對于原先包含A.h的cpp文件,刪除#include "A.h",改成包含stdafx.h,同時打開這些cpp文件(A1.cpp,A2.cpp)的屬性對話框,將屬性對話框中的? "預編譯頭"? ?設置為 "/Yu"即使用預編譯頭。這樣的話,下次編譯A1.cpp,A2.cpp的時候,對于A.h頭文件中的那部分,就不需要編譯了,節省時間。

3、預編譯頭文件原理

  工程對預先編譯的代碼進行編譯,會生成一個pch文件(precompiled header),該文件包含了編譯的結果。注意,可以對任何代碼生成到pch中,但是生成pch是個很耗時的操作,因此,只對那些穩定的代碼創建預編譯頭文件。

4、對于預編譯頭,分為:創建者,使用者,不使用者。

5、注意:現在的編譯器都有Time Stramp 功能,當編譯整個工程的時候,只編譯那些修改的cpp文件。但是,這并沒有解決上面提到的問題。考慮A1.cpp經常修改,每次修改,都要對包含的A.h頭文件部分,進行編譯。

6、Time Stramp:時間戳是指文件屬性里的創建,修改,訪問的時間。每次,文件內容修改,時間戳都會更新為最新的時間,時間戳發生變化,說明文件被修改了。

補充說明:時間戳往往應用在同步,比如音頻視頻不同步。舉例來說,A,B兩個人約定在一起,7點干什么,8點干什么,9點干什么,如果在7點沒有同步,就算了,盡量保證8點同步。也就是說,同步是動態的過程,當不同步時,一個等待,一個追趕,保證下一個時間點同步。

?

?

預編譯頭文件
今天在改一個很大的程序,慢慢看,慢慢改。突然發現一個.c文件,里面什么也沒有,
就幾個頭文件,我一看,我靠,這不是把簡單的問題搞復雜了嗎,隨手刪掉那個c文件。
結果不能編譯了,我靠:
fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\':
No such file or directory
怎么rebuild all都不行。
上網查了一下,才搞懂了:
----------------總結------
如果工程很大,頭文件很多,而有幾個頭文件又是經常要用的,那么
1。把這些頭文件全部寫到一個頭文件里面去,比如寫到preh.h
2。寫一個preh.c,里面只一句話:#include "preh.h"
3。對于preh.c,在project setting里面設置creat precompiled headers,對于其他
.c文件,設置use precompiled header file
//
哈哈
我試了一下,效果很明顯,不用precompiled header,編譯一次我可以去上個廁所,用
precompiled header,編譯的時候,我可以站起來伸個懶腰,活動活動就差不多啦
---------轉載的文章----------
預編譯頭的概念:
所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件里(通常是
以.pch為擴展名的),這個文件就稱為預編譯頭文件這些預先編譯好的代碼可以是任何的
C/C++代碼--------甚至是inline的函數,但是必須是穩定的,在工程開發的過程中不會
被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。注意生成預編
譯頭文件是很耗時間的。同時你得注意預編譯頭文件通常很大,通常有6-7M大。注意及
時清理那些沒有用的預編譯頭文件。
也許你會問:現在的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它
只會編譯那些經過修改的文件,而不會去編譯那些從上次編譯過,到現在沒有被修改過
的文件。那么為什么還要預編譯頭文件呢?答案在這里,我們知道編譯器是以文件為單
位編譯的,一個文件經過修改后,會重新編譯整個文件,當然在這個文件里包含的所有
頭文件中的東西(.eg Macro, Preprocesser )都要重新處理一遍。VC的預編譯頭文件
保存的正是這部分信息。以避免每次都要重新處理這些頭文件。
預編譯頭的作用:
根據上文介紹,預編譯頭文件的作用當然就是提高便宜速度了,有了它你沒有必要每次
都編譯那些不需要經常改變的代碼。編譯性能當然就提高了。
預編譯頭的使用:
要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的
代碼和其他的頭文件,然后我們用這個頭文件來生成一個預編譯頭文件(.pch文件)
想必大家都知道 StdAfx.h這個文件。很多人都認為這是VC提供的一個“系統級別”的
,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。我們來考察一個
典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(因為AppWizard
會為我們指定好如何使用預編譯頭文件,默認的是StdAfx.h,這是VC起的名字)。我們
會發現這個頭文件里包含了以下的頭文件:
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4
Common Controls
#include <afxcmn.h><br

總結

以上是生活随笔為你收集整理的【转】预编译头文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。