C++数组大小声明和const

 victor 发布于 2022-12-20 15:26

我刚刚从C进入C++

在C(89/90)中,a const实际上不是常量(与#define'd enum,或文字相对),而是一旦设置为只读.即,我可以:

const int x = rand();

这很好 - x直到运行时才知道这一点.因此,我不能

int arr[x]; // error - x is not a compile-time constant

然后,C标准之一(99?)继续进行并允许可变长度数组.虽然我通常使用C语言中的ANSI标准编码,但实际上这已经产生了影响,因为我正在尝试拾取C++ 11.

据我所知,C++不允许使用可变长度数组.但是,许多编译器允许它作为扩展(GCC?).问题是,现在我想学习C++ 11,如果有什么我编码为有效的C我不能告诉++或C++扩展与C99兼容.例如:

std::default_random_engine e{};
std::uniform_int_distribution d{};
const int x{d(e)};
int arr[x]; // compiles

我不知道这是否是有效的C++.显然,x直到运行时才知道值.我想我可能不明白C和C++之间的区别const

1 个回答
  • 你是正确的VLAS是C99功能(在C11可选)和C++标准不包含这个功能虽然两者gccclang允许他们在C++作为扩展.我们可以看到他们不允许进入草案C++ 11标准部分8.3.4 Arrays,它说:

    D1 [ constant-expressionopt] attribute-specifier-seqopt
         ^^^^^^^^^^^^^^^^^^^^^^
    

    对于两者而言gcc,clang使用该-pedantic标志将在您使用扩展时发出警告.如果您的目标是C++ 11,那么您还应该指定使用-std=c++11.您可以使用-pedantic-errors将警告变为错误.如果您使用编译代码-pedantic,则应看到以下警告:

    warning: ISO C++ forbids variable length array 'arr' [-Wvla]
    int arr[x]; // compiles
             ^
    

    gcc记录他们对各种标准,默认值和标志的支持,以强制执行GCC页面支持的语言标准标准,并说:

    要获得标准所需的所有诊断,您还应指定-pedantic(或-pedantic-errors,如果您希望它们是错误而不是警告).

    通常clang支持什么gcc,但您可以在其语言兼容性页面上找到更多详细信息.

    请注意,如GingerPlusPlus std所述:vector被认为是C++中VLA的替代品.

    2022-12-20 15:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有