C++ Builder XE2随意学习 (15) > 类静态数据的一个小问题

正如之前所说,学C++ Builder XE2是为了把我自己以前编的程序FutureGraph自CB6升级为C++ Builder XE2版本,这个过程是下了很大决心的,现在刚开始,鼓励自己说前途是光明的,道路是曲折的。

此话不假。

这次升级,想把代码规范下,在C++ Builder XE2中有个Ctrl+D快捷键,再乱的代码,Ctrl+D一下,就规整化了,这一点不错。

靠C++ Builder XE2来规范代码,只是表面的,深层次的还得靠自己。比如,全局变量,命名空间等。

我这次把以前分散定义在各处的全局变量统一在一个地方声明。为了享受C++ Builder XE2的代码完成功能,我就把这些变量声明在一个类TGlobalVariable中,全部实现为静态数据成员。

          /**
* @class TGlobalVariable
* @brief 全局变量类
*
* 本系统中将用到的各种全局变量
* - 若变量名称全大写,表示为常量,不可修改;
* - 反之表示该变量可以动态修改
*
* @author 陈斌文
* @version 2.0
* @date 2012-02-13
*/
class TGlobalVariable {
public:
/** @name 全局可变变量
* @{
*/
static ApplicationStatus ApplicationCurrentStatus;
///< 全局变量:本应用程序的当前状态,缺省为cfsWorking,即工作中

static bool EnableGetRoundValue;
///< 全局变量:取整标志(为真时:如果小数与其最近的整数之间误差小于e, 则取整),缺省为false,即精确化处理
static bool EnableLocateObjectInForm;
///< 全局变量:允许在窗口中定位对象标志,缺省为真
static bool EnableWaitForDelay;
///< 全局变量:允许等待,该标志为假时,将忽略系统的等待函数,主要用于编译过程中对等待函数的处理。缺省为真,即进行等待
static bool EnableWaitNextSimulateStep;
///< 全局变量:允许等待仿真分析下一步骤事件
static bool EnableComulsoryDebug;
///< 全局变量:强制调试标志,如果该标志为真,则将输出所有调试信息。该标志缺省为false,如果文件C:\ForceDebug.txt存在,则该标志为真
static bool EnablePromptMessage;
///< 全局变量:允许弹出提示框的标志
static bool EnableLogElapseInfo;
///< 全局变量: 允许代码段记录耗时量,缺省为false,即不记录

static bool IsApplicationAtTopest;
///< 全局变量:当前应用为激活状态,即为Windows系统的最前端应用

static AnsiString StartPageFileName;
///< 全局变量:起始页面文件名称,缺省为空,可由配置文件进行配置
static AnsiString HelpFileName;
///< 全局变量:帮助文件名称,缺省为FutureGraph.chm

static HANDLE hNextSimulateStepEvent;
///< 全局变量:等待仿真分析下一步骤事件,暂未用
static TObject * GetHelpInfoObject;
///< 全局变量:待取得帮助的对象
static bool EnableRestoreFocusedHandle;
///< 全局变量:定位后允许重回定位前窗口句柄焦点,缺省为false
// static TAppExceptionHandler * AppExceptionHandler;
///< 全局变量:应用异常处理句柄
static int FunctionCallLever;
///< 全局变量:函数调用级数,缺省为-1
static AnsiString UserName;
///< 全局变量:用户姓名,用于提示,缺省为ArWen
static AnsiString ApplicationName;
///< 全局变量:应用名称,用于提示,缺省为 非常图形FutureGraph
static int DisplayDecimalNumber;
///< 全局变量:显示小数时,最多显示其小数点后的数字位数
/** @} 全局可变变量 */

/** @name 全局常量
* @{
*/
static const bool DO_NOT_DELETE_OBJECT;
///< 全局常量:不用删除对象,该值固定为false
static const bool HIDDEN_DIRECTORY;
///< 全局常量:隐藏目录,该值固定为true
static const bool PROMPT_INFO;
///< 全局常量:进行消息提示,该值固定为true
static const double LITTLE_AMOUNT;
///< 全局常量:可忽略的小量,e,该值固定为1e-6
static const double PI;
///< 全局常量:数学圆周率PI
static const int INVALID_TAG_VALUE;
///< 非正常的TAG值(被测对象为空或无TAG属性)
static const int PROGRESS_INVISIBLE;
///< 全局常量:进度条不可见
static const TFloatPoint DEFAULT_FLOAT_POINT;
///< 全局变量:缺省浮点值,为 (-100, -100)
static const bool TTL_HIGH;
///< 全局变量:TTL高值,即真值
static const bool TTL_LOW;
///< 全局变量:TTL低值,即假值
static const AnsiString AUTHOR_NAME;
///< 全局变量:作者姓名,用于版权声明,缺省为BinWen CHEN
static const AnsiString CONFIG_FILE_NAME;
///< 全局变量:配置文件名称,缺省为 cbw.graph.cfg
static const int COLOR_NUMBER;
///< 全局变量:可命名颜色数目
static const TColor FREQUENCE_USED_COLORS[];
///< 全局变量:可命名颜色各值
static const AnsiString FREQUENCE_USED_COLOR_STRINGS[];
///< 全局变量:可命名颜色对应的字符串
static const int CHART_SET_NUMBER;
///< 全局变量:字符集数目
static const int CHAR_SETS[];
///< 全局变量:字符集集合
static const AnsiString CHAR_SET_STRINGS[];
///< 全局变量:字符集对应名称
static const int COMBOBOX_COLOR;
///< 全局变量:下拉框颜色处理
static const int CBW_COMBOBOX_DASH;
///< 全局变量:下拉框虚线样式处理
static const int COMBOBOX_LINETYPE;
///< 全局变量:下拉框线类型处理
static const int COMBOBOX_CAPSTYLE;
///< 全局变量:下拉框线端格式处理
static const int COMBOBOX_CAPSIZE;
///< 全局变量:下拉框线端尺寸处理
static const int COMBOBOX_BRUSHSTYLE;
///< 全局变量:下拉框画刷样式处理
static const int LISTBOX_DELETE_KEYDOWN;
///< 全局变量:列表框删除键处理
/** @} 全局常量 */
};

不知是哪位仙人说过:理想很丰满,现实很骨感。TMD太对了。

代码写成这样后,确实也爽了一段时间,感觉自己的编程水平提高了不少,效率也高。谁说程序员一天只能编几十行代码,我一天可以整理上千行代码。

一直爽ing,直到刚才

我判断一个值是否为某个常量,如LISTBOX_DELETE_KEYDOWN

代码写成这样,神仙都说没错:

void __fastcall THelper::ATFormatOnListBox(TListBox * listBox, int type)
{
    switch(type) {
        case TGlobalVariable::LISTBOX_DELETE_KEYDOWN:
               ...
               break;
        default:
               break;
    }
}

编译居然说错:

[BCC32 Error]HelperObjects.cpp(176): E2313 Constant expression required.

傻眼了,我在类外声明实现后,编译OK。

幸亏是在虚拟机里安装的CB XE2,在主机里还有CB6,回到CB6下测试一下,居然通过了。

唉,一声叹息。

用还是不用,这是个问题。

还是接着用吧,至多不在switch语句中判断全局常量了,我改用if...else...总可以了吧。

if(TGlobalVariable::LISTBOX_DELETE_KEYDOWN == type)

...

能通过上面这两句代码看得出我是编程资深人士的,他确实是高手。

基本可以确定是embarcadero的一个小BUG。

今年情人节略过,Arwen留此存念。

原文地址:https://www.cnblogs.com/drgraph/p/2351897.html