如果有人说,VC的宏能够影响到类成员变量的属性,你信吗?反正是我信了!
今天在修改一个程序的时候,我在类A的外部使用指向类B的指针,居然能够访问到类B的受保护成员变量!!!!!这让我感到非常奇怪,于是来到变量的声明处,以前由于自己懒,直接在自动生成的代码后边进行声明。
代码如下:
protected: // create from serialization only CMSampleView(); 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。
今天发现的一个VC6.0在私有变量声明时的BUG
最新推荐文章于 2021-08-10 22:11:00 发布