避免標頭檔案的重定義

2021-06-26 16:58:21 字數 543 閱讀 1471

假設原始檔test.c中包含a.h和b.h兩個標頭檔案,而a.h和b.h裡又都包含另乙個標頭檔案x.h(很常見),那麼x.h就會被test.c兩次include,如果x.h裡定義了某結構體,如:

typedef struct

test

預處理(見c編譯過程)後,test.c裡包含兩個struct test定義,編譯器就會報重定義錯誤。乙個巧妙辦法是套用下面標頭檔案模板(俗稱標頭檔案衛士):

#ifndef _hdrname_h //_hdrname_h按標頭檔案的檔名取名,防止同名衝突

#define _hdrname_h

…… (content of header file)

#endif

當頭檔案第一次被包含,_hdrname_h還未define,#ifndef條件滿足,預處理器進入#ifndef和#endif之間,_hdrname_h被正式define,標頭檔案內容也得到處理。當再次被包含,由於_hdrname_h已定義,開頭的#ifndef不再滿足,標頭檔案內容被直接忽略。這樣防止因標頭檔案重複包含引起的型別重定義錯誤。這種做法基本算是c的江湖標準了。

如何定義標頭檔案以防重定義的錯誤

typedef struct ortpmemoryfunctionsortpmemoryfunctions 標頭檔案被多次引用了。比如 這個是在a.h裡,main.c裡引用了a.h 和b.h,而b.h又引用了a.h,如果a.h裡沒有 ifndef a h define a h 這裡包含了typede...

避免標頭檔案重複引入和重複定義

使用預編譯指令,常用的預編譯指令如下 條件編譯 define 巨集定義 undef 取消巨集 include 文字包含 ifdef 如果巨集被定義就進行編譯 if defined 與ifdefine的區別在於可以可以組成複雜的判別條件 ifndef 如果巨集未被定義就進行編譯 if defined ...

避免標頭檔案的多重包含

通過預處理器變數,我們可以以標頭檔案保護符的形式避免在已經見到標頭檔案的情況下重新處理該標頭檔案的內容。使用預處理器變數作為標頭檔案保護符。預處理器變數有兩種狀態 已定義與未定義。define指示接受乙個名字並定義該名字為預處理器變數。ifndef指示檢測指定的預處理器變數是否未定義。如果預處理器變...