C++ Builder XE2随意学习 (15) > 类静态数据的一个小问题
2012-02-14 22:20
471 查看
正如之前所说,学C++ Builder XE2是为了把我自己以前编的程序FutureGraph自CB6升级为C++ Builder XE2版本,这个过程是下了很大决心的,现在刚开始,鼓励自己说前途是光明的,道路是曲折的。
此话不假。
这次升级,想把代码规范下,在C++ Builder XE2中有个Ctrl+D快捷键,再乱的代码,Ctrl+D一下,就规整化了,这一点不错。
靠C++ Builder XE2来规范代码,只是表面的,深层次的还得靠自己。比如,全局变量,命名空间等。
我这次把以前分散定义在各处的全局变量统一在一个地方声明。为了享受C++ Builder XE2的代码完成功能,我就把这些变量声明在一个类TGlobalVariable中,全部实现为静态数据成员。
不知是哪位仙人说过:理想很丰满,现实很骨感。TMD太对了。
代码写成这样后,确实也爽了一段时间,感觉自己的编程水平提高了不少,效率也高。谁说程序员一天只能编几十行代码,我一天可以整理上千行代码。
一直爽ing,直到刚才
我判断一个值是否为某个常量,如LISTBOX_DELETE_KEYDOWN
代码写成这样,神仙都说没错:
编译居然说错:
[BCC32 Error]HelperObjects.cpp(176): E2313 Constant expression required.
傻眼了,我在类外声明实现后,编译OK。
幸亏是在虚拟机里安装的CB XE2,在主机里还有CB6,回到CB6下测试一下,居然通过了。
唉,一声叹息。
用还是不用,这是个问题。
还是接着用吧,至多不在switch语句中判断全局常量了,我改用if...else...总可以了吧。
能通过上面这两句代码看得出我是编程资深人士的,他确实是高手。
基本可以确定是embarcadero的一个小BUG。
今年情人节略过,Arwen留此存念。
此话不假。
这次升级,想把代码规范下,在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留此存念。
相关文章推荐
- C++ Builder XE2随意学习(9) > 安装实录
- C++ Builder XE2随意学习 (10) > AlphaControls控件使用初探
- C++ Builder XE2随意学习 (11) > DevExpress Ribbon界面效果
- C++ Builder XE2随意学习 (4) > Delphi XE2官方视频教程31天
- C++ Builder XE2随意学习 (12) > DevExpress Dock拖动框架实现
- C++ Builder XE2随意学习 (13) > Gdiplus
- C++ Builder XE2随意学习 (14) > 窗口透明处理
- C++ Builder XE2随意学习 (3) > FireMonkey类结构初探
- C++ Builder XE2随意学习 (7) > RAD Studio XE2 – Setting it up for a Mac
- C++ Builder XE2随意学习 (2) > 准备工作
- C++ Builder XE2随意学习 (5) > 我的学习路线
- C++ Builder XE2随意学习 (6) > System
- <项目一>请教一个关于获取post json数据的问题
- MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求
- <转>c++ builder JSONCPP 注意事项 XE2 解决编译问题 _Mfl
- Java学习笔记-问问题?-->静态方法
- 数据更新:updata 逻辑运算符的优先等级问题 not>and>or 删除一个表中的内容 约束
- C++ Builder XE2随意学习 (1)
- Local Response Normalization作用——感觉LRN也是解决的梯度消失和爆炸问题,统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的
- 一个“玩”数据前辈的职业规划,值得学习和借鉴