今天发现的一个VC6.0在私有变量声明时的BUG

来源:互联网 发布:php 阿里大于短信接口 编辑:程序博客网 时间:2024/06/14 01:12

 如果有人说,VC的宏能够影响到类成员变量的属性,你信吗?反正是我信了!

今天在修改一个程序的时候,我在类A的外部使用指向类B的指针,居然能够访问到类B的受保护成员变量!!!!!这让我感到非常奇怪,于是来到变量的声明处,以前由于自己懒,直接在自动生成的代码后边进行声明。

代码如下:

protected: // create from serialization onlyCMSampleView();DECLARE_DYNCREATE(CMSampleView)CMapX  m_ctrlMapX;


 

我就想是不是DECLARE_DYNCREATE这个宏影响到了m_ctrlMap的属性呢?

于是我在m_ctrlMap前面加上访问修饰符protected。于是就可以受保护成员变量就能“被保护了”。

error C2248: 'm_ctrlMapX' : cannot access protected member declared in class 'CMSampleView'

 

————————————     华丽的分割线    ———————————


最近被人提到这个问题,他说这里不能算是一个bug,也就是说DECLARE_DYNCREATE做了某些不好的事情。那么看下这个宏到底干了啥:

#define DECLARE_DYNCREATE(class_name) \DECLARE_DYNAMIC(class_name) \static CObject* PASCAL CreateObject();#define DECLARE_DYNAMIC(class_name) \protected: \static CRuntimeClass* PASCAL _GetBaseClass(); \public: \static const CRuntimeClass class##class_name; \static CRuntimeClass* PASCAL GetThisClass(); \virtual CRuntimeClass* GetRuntimeClass() const; \

现在谜底揭晓了:

DECLARE_DYNCREATE包含了DECLARE_DYNAMIC,而DECLARE_DYNAMIC里面在末尾使用了public修饰符,然后,使用的

m_ctrlMapX变量就被这个public影响到了。

btw,C里面的宏确实在使用的时候得小心一点,在C++里面尽量少用宏定义,如常量定义,不要写成

#define MAX_LENGTH1024

写成:

const int MAX_LENGTH = 1024;

如果只在本文件中使用,最好写成:

static  const int MAX_LENGTH = 1024;


简洁明了的变量定义,在很多时候能够帮助到我们,减少代码里面出现某些诡异bug。

原创粉丝点击