下午好一切,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中看到?
單行h文件比所有cpp文件中的「單行」要好;見例如[這裏](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) – anatolyg
順便說一句,你可以將你現有的聲明'extern const bool blnShowSteps'粘貼到專用的h文件中,並繼續使用你的全局變量而不是替換它通過編譯標誌。這兩種選擇都不是理想的,只有你可以決定哪個更好。全局變量的一個優點是靈活性:您可以暫時將其設置爲0,然後重置爲1. – anatolyg
我將變量設置爲非常量,以便您可以在運行時打開或關閉診斷,而無需重新生成可執行文件。從長遠來看,這可能會更有用。 –