大家下午好,
我正在编写一个程序来读取目前有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中创建一个全局变量来实现的,如下所示:
// global variables /////////////////////////////////////////////////////////////////////////////// const bool blnShowSteps = false;
然后在DetectPlates.h和DetectChars.h中,我有以下内容:
// 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中#include"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 ()大多数人在确定程序流程时会直观地看.
有没有办法做到这一点,"#define SHOW_STEPS"行将在Main.cpp中,但仍然可以在DetectPlates.cpp和DetectPlates.cpp中看到?
如您所料 - 将定义放在头文件(.h)中,并在必要时包含它.
要么是,要么不使用编译器技巧,创建配置类,并将配置对象传递给程序的相关部分.使配置类从文件中读取或以相关方式初始化.
编辑:只是评论,"为了使这更多"C++ ish"我想将全局变量更改为条件编译".两者都是非常狡猾的做法.体面的代码设计可能就是你想要的!