zoukankan      html  css  js  c++  java
  • 数组定义

    在我们学习的语言当中,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中的未提示出错误,可以说是潜伏在程序中的艾魔!

  • 相关阅读:
    MySQL事务_transaction
    mysql
    反射跳过泛型检查
    spring java.io.FileNotFoundException cannot be opened because it does not exist
    Servlet中ServletConfig的作用
    Exception in thread "main" java.lang.ClassCastException: java.base/java.util.HashMap$Values cannot be cast to java.base/java.util.ArrayList
    java中字符串和其他数据类型之间使用“+”号连接
    comboBox加载数据
    自动填充
    3号随笔,搭建web环境
  • 原文地址:https://www.cnblogs.com/ubunoon/p/ArrayDefinition.html
Copyright © 2011-2022 走看看