首頁>Club>
8
回覆列表
  • 1 # 使用者3584023715384563

    所謂預編譯頭,就是把標頭檔案事先編譯成一種二進位制的中間格式,供後續的編譯過程使用。gcc編譯標頭檔案後的中間檔案是*.gch。

    g++xxx.h

    把.h檔案當成.cpp檔案一樣來編譯。如果需要控制編譯細節,比如常量定義之類,可加上其它選項。執行之後,會在同個目錄裡生成一個名叫xxx.h.gch的檔案。

    注意在編譯.gch的過程中,gcc並沒有使用環境變數或-i選項來查詢被編譯的標頭檔案,被編譯的標頭檔案必須在當前目錄下。然而,被編譯的標頭檔案所進一步包含的其它標頭檔案,卻可以透過以上途徑找到。簡言之,就是把直接編譯的那個標頭檔案以類似對待.cpp檔案的方式處理了。

    使用過程中,照搬一些stdafx.h相關的注意事項,它們同樣適用於.gch檔案:應該把那些不常修改的(首當其衝,當然是系統的)標頭檔案放在預編譯頭裡,而那些屬於你的程式的一部分的標頭檔案,一般並不放在預編譯頭裡,因為它們可能隨時要被修改的。每修改一次就要重新生成預編譯頭,並沒有速度優勢可言,失去預編譯頭的意義了。另外重要的注意事項是:如果你生成預編譯頭的時候用了一些選項,比如宏定義,那麼使用這個預編譯頭的其它原始碼檔案,被編譯的時候也要使用這些選項,否則會因為不匹配而編譯失敗。

    使用預編譯後的檔案時,只要包含其所對應的.h檔案即可!比如標頭檔案叫foo.h,另外有一大堆其它檔案都包含了這個foo.h,原來沒有使用預編譯頭技術,現在忽然想使用了,於是把foo.h編譯成了foo.h.gch。那其它檔案要做怎樣的修改?——什麼都不用,一切照舊!聰明的gcc編譯器在查詢一個.h檔案之前,會自動查詢其目錄裡有沒有對應的.gch檔案,如有,且可用,則用之;沒有,才用到真正的.h標頭檔案。——慢著,“如有,且可用”,什麼叫“可用”?——就是指這個.gch格式要正確,版本要相容,而且如上所述,編譯兩者要用同樣的選項。如果.gch不可用,編譯器會給出一條警告,告訴我們:這個預編譯頭不能用!我只好用原有的.h標頭檔案啦!什麼?你說看不到這個警告?——當然,要先開啟

    -winvalid-pch選項才行,其預設是關閉的。

    用-h選項感受一下預編譯頭的清爽吧!再沒有滾不完的標頭檔案了,明顯提高的速度,絕對會讓你有種翻身解放的感覺,原來mingw也可以和蝸牛般的速度說再見的。

  • 中秋節和大豐收的關聯?
  • 雪裡紅茄子最好吃的做法?