一種KEIL中定義過的變數在使用中提示未定義的情況

2022-06-30 12:03:08 字數 1597 閱讀 1264

【環境】

> 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定義。如果要在標頭檔案中定義有以下兩種方法 ...