複雜工程中標頭檔案眾多,很容易發生包含順序、重複引用以及迴圈引用導致的編譯鏈結錯誤!最近整理工程中檔案引用時遇到不少這方面的問題!一般來說,包含順序問題會導致某些型別、函式等無定義,只要對工程有功能、框架性的了解,這方面的問題很容易避免!
重複引用在幾乎所有的工程中隨處可見,如果頭檔案格式不對,重定義的錯誤提示躍然紙上!一般來說,有兩種方式可以在重複引用標頭檔案而不發生錯誤:
1、標頭檔案中加上#pragma once
這是乙個比較常用的指令,只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次。
2、#ifndef,#define,#endif用來防止某個巨集被多次定義,防止標頭檔案重複編譯。
現在基本上已經是每個編譯器都有這個定義了;#ifndef,#define,#endif這個是c++語言相關,這是c++語言中的巨集定義,通
過巨集定義避免檔案多次編譯。所以在所有支援c++語言的編譯器上都是有效的,如果寫的程式要跨平台,最好使用這種方式。
標頭檔案迴圈引用在包含過程中形成了迴圈,彼此依賴,去除這類錯誤需要打破這個迴圈,mfc中可以在預編譯檔案中包含標頭檔案消除這種情況!不過從**的有效性和效率方面,應該避免在include中引用其他標頭檔案,需要引用其他類和型別的地方盡量採用前向宣告!前向宣告不要型別的定義,可以提高編譯效率,降低檔案間的依賴性!
keil中include 標頭檔案迴圈引用問題
在標頭檔案中使用 ifdef和 ifndef是非常重要的,可以防止雙重定義的錯誤。有時候,在b.h中會include a.h 在 c.h 中會include b.h 及include a.h 這時,如果不用ifndef endif,就會包含兩次a.h,產生錯誤。還是把頭檔案的內容都放在 ifndef...
避免標頭檔案重複引入和重複定義
使用預編譯指令,常用的預編譯指令如下 條件編譯 define 巨集定義 undef 取消巨集 include 文字包含 ifdef 如果巨集被定義就進行編譯 if defined 與ifdefine的區別在於可以可以組成複雜的判別條件 ifndef 如果巨集未被定義就進行編譯 if defined ...
C語言標頭檔案條件編譯避免重複引用
條件編譯 條件編譯屬於三種巨集定義中的一種,條件指示符的最主要目的是防止標頭檔案的重複包含和編譯,例如 乙個c檔案包含同乙個h檔案多次,如果不加 ifndef巨集定義,會出現變數重複定義的錯誤。指令 用途 空指令,無任何效果 include 包含乙個源 檔案 define 定義巨集 undef 取消...