linux下專案開發中防止重複定義和重複包含的方法
我們在網上下載的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<stdio.h>
Test2.h:
#include” Test1.h”
Test1.cpp
#include” Test1.h”
Void pf1()
{
Printf(“hello world!/n ok1”);
}
Test2.cpp:
#include” Test2.h”
Void pf2()
{
Printf(“hello world /n ok2”);
}
Main.cpp
#include” Test1.h”
#include” Test2.h”
Int main()
{
Pf1();
Pf2();
return 0;
}
這樣直接生成project檔案和makefile檔案會出現錯誤。原因很簡單,你重複包含了#include<stdio.h>。
解決這個問題的辦法很簡單,用一開始提到的條件編譯。
把修改如下:
Test1.h:
#ifndef TEST
#define TEST
#include<stdio.h>
#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裡用的策略。
其實,我們要想防止重複定義,最好使用條件編譯。
說的可能有點亂,希望對大家有幫助。