现在的位置: 首页 > 综合 > 正文

数组定义

2013年05月21日 ⁄ 综合 ⁄ 共 1008字 ⁄ 字号 评论关闭

在我们学习的语言当中,C/C++语言要求我们定义的数组在编译时必须为确切的整数值。在modern C++一书中给我们提供了一种定义数组的方法:

  int array[(count<=1)?1:0];
我们先不管count的值为多少,数组里面是一个表达式,表达式的值只可能取1或者0,那么数组该如何定义呢?这条语句是正确的吗?

在gcc中,该语句被正常编译通过,并且并没有产生不良影响,而且也不起什么作用,给数组arrary[0] = 1;也不产生错误,注意array数组定义为0个!!!

在vs2005版本中,该语句就不能够被正常编译,出现三条错误:
error C2057: 应输入常量表达式
error C2466: 不能分配常量大小为 0 的数组
error C2133: “array”: 未知的大小

而在modern C++中说到此处可以被编译,而且在数组个数为0的时候,会提出错误信息,从而在编译期获取程序错误,而不必等到运行时(assert)来获取。

modern C++的原话如下:
The simplest solution to compile-time assertions (Van Horn 1997), and one that works in C as well as in C++, relies on the fact that a zero-length array is illegal.
#define STATIC_CHECK(expr) { char unnamed[(expr) ? 1 : 0]; }
 这是侯捷书中的翻译
最簡單的方式稱為 compile-time assertions(Van Horn 1997),在 C 和 C++  語言中都可以良好運作。它依賴一個事實:大小為零的 array是非法的。
#define STATIC_CHECK(expr) { char unnamed[(expr) ? 1 : 0]; }

从上面的调试结果来看,modern C++的说法大小为零的array数组是非法的,但在目前主流的编译器中支持的都不是很好。也许modern C++说的是标准c++中的内容,但是我们知道,目前仍有大部分编译器对标准c++支持的不是很好,很多时候,我们更需要对自己所用编译器支持多少标准C++有一个更清楚的了解!

因此,虽然说modern c++是一本非常不错的书,但其中的一些内容,需要在编译器上调试过才知道是否可以在实际项目中使用,否则,将会死的很惨,尤其是gcc中的未提示出错误,可以说是潜伏在程序中的艾魔!

抱歉!评论已关闭.