c或
c++
原始碼,當你開啟其中的標頭檔案時,如果你是乙個心細的計算機愛好者你會發現他們寫的標頭檔案都包含在乙個條件編譯中。比如:
#ifndef clock_h
#define clock_h
原始碼部分
………………….
#endif //clock_h
好了,現在說一說它們的作用。
這個條件編譯的作用不體現在這個檔案中,而是體現在整個
project
中。我們一般在
linux
下做開發時,
project
檔案和makefile
檔案要用工具生成或者自己書寫。
我們在建立
project
裡的檔案時一般乙個功能建立乙個
*.h和
*.cpp
檔案,而在含有
main
函式的檔案裡包含所有的標頭檔案。
我們為了說明條件編譯的意義,簡單舉例。
下面有五個檔案:
test1.h test2.h
這兩個標頭檔案
test1.cpp test2.cpp
兩個cpp
檔案乙個
main.cpp
其內容如下:
test1.h:
#include
test2.h:
#include」 test1.h」
test1.cpp
#include」 test1.h」
void pf1()
test2.cpp:
#include」 test2.h」
void pf2()
main.cpp
#include」 test1.h」
#include」 test2.h」
int main()
這樣直接生成
project
檔案和makefile
檔案會出現錯誤。原因很簡單,你重複包含了
#include
。解決這個問題的辦法很簡單,用一開始提到的條件編譯。
把修改如下:
test1.h:
#ifndef test
#define test
#include
#endf
test2.h:
#ifndef test2
#define test2
#include 「test1.h」
#endf
這樣修改之後,就能保證你的標頭檔案只能被包含一次。這樣,你在建立整個
project
時就不用考慮該包含那個標頭檔案,以防止重複包含。
還有,像這樣用條件編譯解決重複定義的用法很多。比如你要在乙個檔案中定義一些全域性變數,而你又不想在其它包含它的所有檔案都用
extern
宣告。你可以用這樣的策略:在你定義全域性變數的標頭檔案裡用條件編譯方法。
#ifdefos_globals
#defineos_ext
#else
#defineos_extextern
#endif
在定義變數時在前面加上
os_ext。
在所有引用此標頭檔案的檔案裡,有乙個定義
os_globals
這個,其它所有引用此標頭檔案的檔案都不定義
os_globals
。就實現了,宣告全域性變數的標頭檔案被多次應用但只被定義一次,其它檔案是對變數的宣告。
其實這是
ucos
裡用的策略。
其實,我們要想防止重複定義,最好使用條件編譯。
說的可能有點亂,希望對大家有幫助。
linux下防止rm rf 處理
很不幸,之所以要寫這篇文章。是因為自己嚐過其中的痛。不過還好只是在自己虛擬機器上誤刪。為了防止以上事情的再次發生,寫一下我現在處理方式。現在網上的處理方案主要是 1 將刪除改為mv命令,然後再去 站清除檔案。2 用afe rm代替rm,設定部分白名單,減小誤刪時候損失程度。3 用rm rfi 代替r...
linux下防止多重定義
以前沒有做過工程專案,如今遇到了很多問題,我希望把自己遇到的問題記錄下來,就比如最近遇到的重定義問題,因為是自己寫makefile的緣故,我在.件中定義了變數,檢查了 邏輯沒有問題,但是在編譯過程中卻頻頻的報錯,定義變數重定義。解決的辦法。一,將你要定義的變數寫到乙個.件中,讓所有的檔案都呼叫它。二...
thinkphp中多表查詢中防止資料重複sql語句
下面先來看看例子 table id name 1 a2 b 3 c4 c 5 b庫結構大概這樣,這只是乙個簡單的例子,實際情況會複雜得多。select count distinct name from table group by name 結果 id name count distinct nam...