解決標頭檔案重複包含問題
標頭檔案重複包含原因
建立標頭檔案 mylib.h ,與 test.c 放在同一工程下。
在 mylib.h 中定義結構體 tagtest ,編寫程式1:
struct tagtest;
在 test.c 中包含 mylib.h 標頭檔案,編寫程式2:
#include#include"mylib.h"int main(){}
編譯通過, 0 錯誤,0 警告。
如果在開發中不下心,在 test.c 中,又包含了一次 mylib.h 標頭檔案,編寫程式3:
#include#include"mylib.h"#include"mylib.h"int main(){}
包含第一次標頭檔案 mylib.h 後,結構體 tagtest 定義成功,而包含第二次相同標頭檔案後,因為結構體 tagtest 已經定義一次,所以提示,編譯錯誤,結構體重複定義。
在開發設計多個標頭檔案過程中,經常有可能出現這類問題, 例如:a.h 包含了 b.h,b.h 包含了 c.h,而 c.h 又包含了 a.h,就會造成標頭檔案重複包含的問題。
解決標頭檔案重複包含問題
利用巨集,解決標頭檔案重複編譯問題。test.c 程式不變,在 mylib.h 中編寫程式4:
#ifndef mylib_h#define mylib_hstruct tagtest;#endif
標頭檔案第一次包含時,沒有定義巨集 mylib_h ,滿足條件編譯,執行下面的**,定義巨集 mylib_h ,並執行結構體定義。標頭檔案第二次包含時,已經定義巨集 mylib_h ,不滿足條件編譯,下面的**就不再執行。
所以,不會因為標頭檔案包含兩次,造成結構體重複定義的編譯錯誤,可成功編譯通過。
這時就需要用到全球唯一識別符號工具,在 windows 執行中輸入 guidgen。
這個工具通過某些演算法加本機特性會產生全球唯一識別符號,在理想情況下,任何計算機和計算機集群都不會生成兩個相同的全球唯一識別符號。
將生成的全球唯一識別符號拷貝下來,複製到**中,利用巨集加全球唯一識別符號定義的標頭檔案,徹底解決了標頭檔案重複包含的問題。在 mylib.h 中編寫程式5:
#ifndef mylib_h_e4a3d063-4774-489b-b5bb-73e1a540a127#define mylib_h_e4a3d063-4774-489b-b5bb-73e1a540a127struct tagtest;#endif
編譯器也是用這種方法,解決標頭檔案重複包含問題的。在 vc6.0 中建立 win32控制台應用程式的乙個"hello world"應用。
建立好之後,編譯器自動整理了檔案結構,並在原始碼檔案 test.cpp 中引入自定義標頭檔案 stdafx.h。
開啟 stdafx.h 標頭檔案發現,編譯器也是用條件判斷巨集定義加全球唯一識別符號解決標頭檔案重複包含的問題。
掃碼關注
檔案的編碼問題解決
很多時候,我們需要在linux ubuntu,centos等 mac和windows之間共享一些檔案,但是因為各個平台自帶支援的編碼不一致,有的是gb2312 window預設 有的是utf 8。導致跨平台無法正確開啟檔案,比如windows下的gb2312編碼檔案放到mac下,如果mac沒有安裝g...
Python 檔案編碼問題解決
最近使用python操作檔案,經常遇到編碼錯誤的問題,例如 unicodedecodeerror utf 8 codec can t decode byte 0xbe in position 350 in encoding utf 8 雖然這種類似的方法也能解決。但是這種方法只能靠運氣去碰,如果剛好...
oom問題解決
dalvik虛擬機會為應用程式分配固定大小的heap 如果使用超過了這個heap的大小,且沒有可被 物件,就會報oom。多張較大會迅速占用空間造成oom。我們可以使用一下的方法來減少這種情況的產生 1.減少單張的大小,根據螢幕大小來對bitmap做resize。private void setima...