当前位置:  开发笔记 > 编程语言 > 正文

C++ #define在main中,如何获取其他.cpp文件才能看到它?

如何解决《C++#define在main中,如何获取其他.cpp文件才能看到它?》经验,为你挑选了1个好方法。

大家下午好,

我正在编写一个程序来读取目前有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中看到?



1> Kieren Johns..:

如您所料 - 将定义放在头文件(.h)中,并在必要时包含它.

要么是,要么不使用编译器技巧,创建配置类,并将配置对象传递给程序的相关部分.使配置类从文件中读取或以相关方式初始化.

编辑:只是评论,"为了使这更多"C++ ish"我想将全局变量更改为条件编译".两者都是非常狡猾的做法.体面的代码设计可能就是你想要的!

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有