-
LZ也明白同樣的事情,確實是避免重複,但不是避免重複宣告,而是避免重複定義。 一般來說,C 的所有宣告都是可重複的,只要重複的宣告是相同的。 但是,即使定義相同,也不應重複定義,重複定義將導致編譯錯誤。
多次包含可能會導致重複定義。 例如,如果檔案包含 and,並且檔案包含 and,則在編譯檔案時,將包含兩次。 我們熟悉標頭檔案中檔案型別的定義,所以檔案定義了兩次,會出現編譯錯誤。
在標頭檔案中使用。
#ifndef _stdio_h
#define _stdio_h
..標頭檔案正文。
#endif
如果首次包含標頭檔案時未定義包含標頭檔案的檔案正文的內容,則在再次包含標頭檔案時,將定義 stdio h,並且 ifndef stdio h 為 false,並且將丟棄頭體(在 ifndef stdio h 和 endif 之間),從而避免包含頭體的內容的重複定義。
-
如果是如果。
ndef 是 notdef 是 notdefine 是 undef 是 undefined。
define 是定義。
endif 是結束 if。
如果未定義。
然後定義。 結束條件。
這樣,如果多個檔案同時包含標頭檔案,則不會出現重複定義錯誤,否則會提示重複定義。
-
ifndef 和 endif 是一對條件預編譯語句,舉個例子:
ifndef abc;這意味著,如果未定義 abc 特性,則編譯後結束前的語句將被省略。
defineabc;本宣告;
defineabc;
endif;
比如有一段**,有時候不需要按需編譯或編譯,比如下面**:
ifdef abc;
一段**; endif;
這意味著,如果在程式中定義了 abc 功能,那麼編譯就是這裡所說的"某段**“,否則不會編譯,如果程式是這樣的:
ifndef abc;
defineabc;
endif;
ifdef abc;
一段**; endif;
那麼這裡提到的“某段**”肯定會被編譯,因為在設計程式開始時,可能有必要根據某個條件來決定是否編譯“某一段**”,但後來發現這樣的條件編譯已經沒有必要了,需要編譯“某段**”, 兩種方式,一種是把ifdef abc和endif;刪除; 另乙個是像這裡,在。
ifdef abc;
一段**; endif;
新增之前。 ifndef abc;
defineabc;
endif;
一般來說,在乙個應用開發系統中,功能的真正邏輯實現是建立在硬體層之上的,在驅動層、功能層程式、使用者應用中完成。 標頭檔案的主要功能是復用多個檔案的全域性變數(函式),防止定義衝突,並給出每個被呼叫函式的描述,它本身不需要包含程式的邏輯實現,它只起到描述性的作用,使用者程式只需要根據標頭檔案中的介面宣告呼叫相關的函式或變數, 鏈結器將從庫中查詢相應的實際定義。(編譯模式[1])。
從上面的結構圖中可以看出,標頭檔案是使用者應用程式和庫之間的橋梁和鏈結。 標頭檔案不是整個軟體中最重要的部分,但它是 C 語言家族中不可或缺的一部分。 編譯過程中,編譯器通過標頭檔案找到對應的函式庫,然後匯出引用函式的實際內容來替換原來的函式。
然後在硬體級別實現該功能。
從上面的例子可以看出,標頭檔案一般由四個部分組成:(1)標頭檔案開頭的版權和版本宣告; (2)預處理塊; (3)內聯功能的定義; (4)函式和類結構宣告等。 在標頭檔案中,使用 ifndef define endif 結構生成預處理塊,並使用 include 格式引用庫的標頭檔案。
標頭檔案的這種結構是 C 語言軟體開發的常識。
-
這是一種旨在避免重複的標頭檔案包含的用法。
假設您自己編寫的標頭檔案是 ,其中包含。 主函式檔案包含,同時又被重複收錄,這在C語言中是乙個錯誤,因為重複定義的問題已經處理好了,不會出現重複收錄錯誤。 解決方案是使用 ifndef 命令。
#ifndef my_h_h_
#define my_h_h_
#endif
以上是避免標頭檔案被重複包含的格式,我的 h h 是乙個識別符號,通常的做法是將頭檔名的所有字母大寫,並將 .把它改成下劃線,如果安全的話,你可以在它後面再加幾個H,省略號的地方是你的標頭檔案的內容。
第一次包含它時,我的 h h 沒有定義,所以定義我的 h h,然後包含標頭檔案的內容。 第二次收錄,因為第一次已經定義了我的h h,所以標頭檔案的內容不再收錄,防止重複收錄。
-
ifndef test 確定是否定義了測試,如果定義了測試,則執行語句 2,否則執行語句 1
語句 1 else
語句 2 endif
-
在乙個大型軟體專案中,可能有多個檔案同時包含乙個標頭檔案,當這些檔案被編譯並鏈結到乙個可執行檔案時,會出現大量的重新定義錯誤。 標頭檔案中的實用程式 ifndef
#define
endif 避免了標頭檔案的重新定義。
方法:例如,如果要編寫標頭檔案。
在標頭檔案的開頭寫兩行:
#ifndef
test_h
#define
測試 H 通常將檔名大寫。
分析:當第一次包含時,由於沒有定義測試h,條件為真,因此包含(執行。
#ifndef
** 在測試 h 和 endif 之間,當第二次包含時,前乙個測試 h 已被定義,條件為 false,ifndef
測試 h 和 endif 之間的 ** 將不再包含,從而避免重新定義。 它主要用於防止重複的巨集定義和重複包含標頭檔案。
-
Q:我真的不知道怎麼跳過,不知道是收錄時直接跳過,還是只跳過編譯的部分,然後收錄最後編譯的標頭檔案)。
答:當它包含在內時,請跳過它。 (但是,此包含僅在編譯時完成)。
問:cpp 檔案就是這種情況,假設 ab 寫入 ifndef endif,但 ab 出現在另乙個 cpp 中,這個 ifndef endif 不起作用,a: 可以。
問:即 ifndef endif 只是確保同一 cpp 中的標頭檔案不會被重複編譯?
答:ifndef 將確保不會有重複引用,以避免編譯錯誤。 但是,這並不是為了避免“在同乙個CPP中使用”。
相反,這是為了避免“任何導致雙重引用的情況”,包括“在同乙個 cpp 檔案中”。 例如,in 和 in 和 in,重複定義錯誤將發生在任何使用或(包括其他標頭檔案)的位置。
答:位定址區域位於資料儲存器中的 20F 和 2Fh 之間。 該區間內的暫存器可以進行位定址,並且可以進行位操作和位運算。 >>>More
崩潰,可能是現場干擾太嚴重。 無論如何,甚至已經放棄了沒有內部程式儲存器和EEPROM的晶元。 究其原因,往往不是程式問題,而是板卡和PCB設計問題。 >>>More