【環境】
> keil5.25
> win10
> @2018-4-23
【問題】
標頭檔案互包含導致的錯誤(使用了另一檔案的型別定義)
檔案
123#ifndef __filea_h__ 4
#define __filea_h__
56 #include "
fileb.h"7
8 typedef struct
9stuct_a_s;
1213
14#endif
檔案
123#ifndef __fileb_h__
4#define __fileb_h__
56 #include "
filea.h"7
8 typedef struct
9struct_b_s;
1314
#endif
編譯後報錯:在檔案中 error: #20: identifier "struct_a_s" is undefined
【分析】
導致上述錯誤的原因,是在檔案中,使用了 fileb.h,而檔案中使用的類 struct_a_s 在其定義之前,故產生了先使用後定義的語法錯誤
具體分析:
從檔案開始分析:
> 執行避免標頭檔案重複包含的巨集 ---
> 包含檔案,進入檔案
> 執行避免標頭檔案重複包含的巨集 ---
> 包含檔案,進入檔案
> 由於避免重複包含巨集的控制,進不去a檔案內容部分,跳轉回檔案
> 執行結構體 struct_b_s 定義,結構體成員型別使用了結構體 struct_a_s ,這就出現了使用了未定義的情況,執行完畢跳轉回檔案
> 執行結構體 struct_a_s 定義,結合上一步就發生了先使用後定義的問題,執行完畢結束
從檔案開始分析:
> 執行避免標頭檔案重複包含的巨集 ---
> 包含檔案,進入檔案
> 執行避免標頭檔案重複包含的巨集 ---
> 包含檔案,進入檔案
> 由於避免重複包含巨集的控制,進不去b檔案內容部分,跳轉回檔案
> 執行結構體 struct_a_s 定義,執行完畢跳轉回檔案
> 執行結構體 struct_b_s 定義,執行完畢結束
結論:編譯器先從檔案開始編譯就不會報錯誤
【解決】
# 去除檔案中包含檔案的語句部分,可解決此問題
> 控制檔案 與 的編譯順序 (做了檔名的更改,即按照字母表順序修改檔名達到兩次編譯時兩個檔案的排序相異)
> 兩次編譯的結果都是報相同的錯誤,error: #20: identifier "struct_a_s" is undefined
【結論】
# 綜上暫推出,編譯器在編譯時,每個檔案都會單獨編譯一遍,所以不**件 與 的排序,都會出現相同的問題
# 一般是杜絕檔案互相包含的,因為檔案包含的意義就是要使用被包含檔案的一些定義,互相包含就會出現先使用後定義 的情況發生
# 了解一些編譯原理的知識後,將會得到更權威的解惑,以上只是根據現象分析的結果
一種在C 中定義預設常量的方法
在c和c 裡我們可以用 define來定義巨集,比如下面這樣 define lac128 define lac256 ifdef lac128 define gf order 8 更多變數 endif ifdef lac256 define gf order 9 更多變數 endif 這個例子中我們...
typedef define重複定義的一種解決方法
與 define不同,typedef沒有類似 undef的方法取消定義,如果兩個庫中同時使用typedef定義了某個型別,便會編譯失敗。乙個解決方法是,在包含第二個庫時使用 define將重複定義的型別名改掉。例如,如果標頭檔案sm system.h和math.h中均包含 typedef x flo...
keil 中建立多檔案時,變數重複定義的解決
c c 語言中有很多地方要用到extern,但是如果沒有真正的了解它的意義,會給程式設計帶來很大的麻煩,為了使大家少走彎路,特祥細的說明一下。對於比較小的程式,一般只有乙個c檔案和乙個標頭檔案,全域性變數我們通常會直接定義在c檔案中,在程式之前加int i定義。如果要在標頭檔案中定義有以下兩種方法 ...