2015-12-13 25 views
0

下午好一切,C++ #define in main,如何讓其他.cpp文件看到它?

我正在寫一個程序來讀取,目前有11個文件車牌:

Main.cpp的

DetectPlates.h DetectPlates.cpp

DetectChars。 h DetectChars.cpp

PossiblePlate.h PossiblePlate.cpp

PossibleChar.h PossibleChar.cpp

Preprocess.h Preprocess.cpp

我有一個功能,允許顯示中間處理步驟,或沒有。目前這是通過在Main.cpp的全局變量如下實施:在DetectPlates.h和DetectChars.h

// global variables /////////////////////////////////////////////////////////////////////////////// 
const bool blnShowSteps = false; 

然後,我有以下幾點:

// external global variables ////////////////////////////////////////////////////////////////////// 
extern const bool blnShowSteps; 

所以無論是DetectPlates。 CPP或DetectChars.cpp我可以做類似如下:

if (blnShowSteps) { 
    cv::imshow("1a", imgGrayscaleScene); 
    cv::imshow("1b", imgThreshScene); 
} 

這兩個DetectPlates.cpp和DetectChars.cpp做過很多次。到目前爲止,我已經使用了一個全局變量,因爲我是從Visual Basic.NET版本翻譯的,其中條件查看錶單和全局變量上覆選框的狀態是一個簡單的翻譯。

爲了讓這個更「C++ ish」,我想將全局變量改爲條件編譯。例如,在Main.cpp的我想這樣做:

#define SHOW_STEPS   // NOTE: comment this line out, or not, to show or not show steps 

然後在DetectPlates.cpp或DetectChars.cpp:

#ifdef SHOW_STEPS 
    cv::imshow("1a", imgGrayscaleScene); 
    cv::imshow("1b", imgThreshScene); 
#endif 

的問題是如何實現這一點?如果我在DetectPlates.h和/或DetectChars.h中包含「Main.cpp」,則根據我是否在Main.cpp中使用多個包含守護進行獲取各種錯誤,但是無論哪種方式,我都沒有編譯,也沒有這違反了從不包含.cpp文件的一般實踐規則。

一個可能的答案似乎是增加一個.h文件中,被稱爲「MyDefines.h」或類似的,只有一行:

// MyDefines.h - single line .h file ?? 

#define SHOW_STEPS   // NOTE: comment this line out to not show steps 

但是,這不是一個完美的解決方案至少有兩個原因,對於添加一個額外的.h文件來添加一行看起來很差,並且這會使#define SHOW_STEPS超出Main.cpp的起始位置,這在邏輯上是。

另一種可能的解決方案似乎是添加Main.h文件,函數原型和其他目前位於Main.cpp頂部的東西,然後添加#define SHOW_STEPS行。這也不是一個非常優雅的解決方案,因爲我會添加一個整體。h文件添加一行,但大多數C++程序沒有Main.h文件,並且這仍然會將#define SHOW_STEPS從main main()函數的正上方刪除,大多數人在計算程序流時會直觀地看到該函數。

有沒有辦法做到這一點,「#define SHOW_STEPS」行將在Main.cpp中,但仍然可以在DetectPlates.cpp和DetectPlates.cpp中看到?

+1

單行h文件比所有cpp文件中的「單行」要好;見例如[這裏](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) – anatolyg

+0

順便說一句,你可以將你現有的聲明'extern const bool blnShowSteps'粘貼到專用的h文件中,並繼續使用你的全局變量而不是替換它通過編譯標誌。這兩種選擇都不是理想的,只有你可以決定哪個更好。全局變量的一個優點是靈活性:您可以暫時將其設置爲0,然後重置爲1. – anatolyg

+0

我將變量設置爲非常量,以便您可以在運行時打開或關閉診斷,而無需重新生成可執行文件。從長遠來看,這可能會更有用。 –

回答

1

讓它爲您的整個項目定義。就像在GCC命令行中加入-DSHOW_STEPS一樣。

+0

感謝您的建議,但我試圖保持獨立的編譯器,並且我還希望源代碼能夠獨立運行而無需特殊的編譯器設置。任何其他方式可以做到這一點? – cdahms

+0

@cdahms那麼你可能需要創建一個'config.h'文件,你可以在其中放置所有配置宏定義幷包含在所有需要它的文件中。通常,項目將所有這些定義移動到單獨的配置文件中,並讓make系統確定哪個編譯器當前正在使用,哪個構建目標以及如何解析定義列表並將其傳遞給編譯器 –

5

正如您懷疑的那樣 - 將定義放在頭文件(.h)中,並將其包含在必要的地方。

要麼是這樣,要麼不使用編譯器技巧,創建配置類,並將配置對象傳遞到程序的相關部分。讓配置類從文件中讀取或以相關方式初始化。

編輯︰剛纔評論,「爲了使這更多」C++ ish「我想改變全局變量條件編譯」。兩者都是非常狡猾的做法。體面的代碼設計可能是你正在尋找的東西!

3

如果您引入了#defines以使您的代碼更加「C++ ish」,那麼您正在做的事情非常錯誤。

你根本不需要明確地刪除if,編譯器可以在給定更好的情況下爲你做這件事。首先,將標題中的全局變量從extern更改爲static

......這應該夠了。如果有疑問,請檢查asm輸出。

相關問題