我不知道在你所提到的环境中 char a[0] 和 char a[1]是否能起到相同效果。 如果相同,则azuo_lee所举的例子很好的说明了这种用法,即:把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。
既然azuo_lee说到了这种用法,而且是“这个用法遍地都是”。我想借此宝地向大家转述大师Stanley B.Lippman对此的看法。
C程序员的巧计有时候却成为C++程序员的陷阱 例如把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组: struct mumble{ char pc[1]; }
//从标准输入装置中取得一个字符串 //然后为struct本身和该字符串分配足够的内存 struct mumble *pmumbl =(struct mumble*) malloc(sizeof(struct mumble)+strlen(string)+1);
strcpy(&memble.pc,string);
如果我们改用class来声明,而该class是: #指定多个access sections,内含数据; #从另一个class派生而来; #定义有一个或多个virtual functions;
那么以上用法或许可以顺利转化,但或许不行!
C++中凡处于同一个access section的数据,必定保证以其声明的次序出现在内存布局中。然而被放置在多个access sections中的各笔数据,排列次序就不一定了。下面的声名中,前述的C伎俩或许可以有效运行,或许不能,需视protected data members被放在private data members的前面或后面(放在前面才可以): class strumble{ public: // operations ... protected: // protected stuff private: // privated stuff char pc[1]; };
... ...所以最好的忠告就是:不要那么做。
以上内容摘自《深度探索C++对象模型》,仅供参考。
|