是否“int size = 10;”产生一个常量表达式?

2023-12-20

以下代码在 gcc 4.8 和 Clang 3.2 下编译:

int main()
{
  int size = 10;
  int arr[size];
}

C++标准的8.3.4/1规定数组的大小必须是整型常量表达式,即size似乎不是。这是两个编译器中的错误,还是我遗漏了什么?

最新的 VC++ CTP 拒绝了带有以下有趣消息的代码:

error C2466: cannot allocate an array of constant size 0

有趣的部分是它似乎如何认为size为零。但至少它拒绝了该代码。 gcc 和 Clang 不应该做同样的事情吗?


This is 变长数组 http://en.wikipedia.org/wiki/Variable-length_array or VLA这是一个C99特点但是gcc http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html and clang http://clang.llvm.org/compatibility.html#vla支持它作为扩展C++而视觉工作室does not http://msdn.microsoft.com/en-us/library/zb1574zs.aspx. So Visual Studio在这种情况下遵守标准并且在技术上是正确的。并不是说扩展不好,Linux 内核依赖于许多 gcc 扩展 http://www.ibm.com/developerworks/library/l-gcc-hacks/,因此它们在某些情况下很有用。

如果您添加-pedantic标记两者gcc and clang例如,会警告您这一点gcc says (现场观看 http://coliru.stacked-crooked.com/a/67bafb84ad611631):

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

使用-pedantic-errors标志将使这是一个错误。您可以在这些文档中阅读有关扩展的更多信息GCC 支持的语言标准 http://gcc.gnu.org/onlinedocs/gcc/Standards.html#Standards and clans 语言兼容性部分 http://clang.llvm.org/compatibility.html.

Update

The C++ 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf涵盖什么是积分常量表达式在部分5.19 常量表达式段落3并说:

整型常量表达式是整型或无作用域枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。 [...]

从阅读本文中,所有可能性并不是直观明显的,但是Boost 整型常量表达式的编码指南 http://www.boost.org/development/int_const_guidelines.html这方面做得很好。

在这种情况下,因为您正在初始化size with a literal using const足以使其成为积分常量表达式 (see [expr.const]p2.9.1 https://timsong-cpp.github.io/cppwp/n3337/expr.const#2.9.1)并使代码恢复标准C++:

const int size = 10;

using 常量表达式也会起作用:

constexpr int size = 10;

阅读可能会有所帮助之间的区别constexpr and const https://stackoverflow.com/questions/14116003/difference-between-constexpr-and-const.

作为参考,等效部分8.3.4段落1 in the C99标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf将是部分6.7.5.2 数组声明符段落4其中说(强调我的):

If the size is not present, the array type is an incomplete type. If the size is * instead of being an expression, the array type is a variable length array type of unspecified size, which can only be used in declarations with function prototype scope;124) such arrays are nonetheless complete types. If the size is an integer constant expression and the element type has a known constant size, the array type is not a variable length array type; otherwise, the array type is a variable length array type.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否“int size = 10;”产生一个常量表达式? 的相关文章

  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 使用 C# 中的 Google 地图 API 和 SSIS 包获取行驶距离

    更新 找到了谷歌距离矩阵并尝试相应地修改我的代码 我在这里收到无效参数错误 return new GeoLocation dstnc uri ToString catch return new GeoLocation 0 0 https 基
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • Flink CsvTableSource 流式传输

    我想使用 flink 流式传输 csv 文件并执行 sql 操作 但我编写的代码只读取一次并停止 它不流式传输 提前致谢 StreamExecutionEnvironment env StreamExecutionEnvironment g
  • 在qt中动态添加小部件

    我在向 QMainWindow 添加小部件时遇到一个小问题 当我这样做时 wsk mainStatki new mainStatki this wsk mainStatki gt setGeometry 0 0 400 300 this g
  • 通过 QID 获取属性?

    我可以通过标签获取项目及其属性 SELECT distinct item itemLabel itemDescription SAMPLE DR as DR SAMPLE article as article WHERE item wdt
  • 将日期时间转换为日期

    如何将 Grails 中的日期时间字段转换为日期 而不捕获时间 我需要这样做是为了与系统日期进行比较 class Trip String name String city Date startDate Date endDate String
  • 指向 Objective-C 中指针的指针?

    我想在 Objective C 中声明一个指向指针的指针 我有一个实例变量 primaryConnection 当它发生变化时 应该动态更新它以指向局部变量 NSURLConnection primaryConnection void do
  • 如何修复 docker-machine 中过期的客户端证书

    Doing a docker machine lsa 得到了意想不到的Unable to query docker version Get https x x x x 2376 v1 15 version x509 certificate
  • HTML 5 <画布>

    这是我的代码 需要帮助使用 html 5 canvas 元素和 javascript 代码在山地景观之间绘制云的图像
  • Xcode 7.3.1 无法正确自动完成

    我有一个简单的 全新的 Objective C 项目 适用于 OSX El Capitan 10 11 4 上的 iOS 我使用的是 Cocoapods 因此我使用以下 3 个 pod 创建了 Podfile Firebase UALogg
  • 为什么 .every() 不是函数?

    我收集了所需表单元素的数组 我认为 并添加了 模糊 侦听器 var formInputs input filter required formInputs each function i this on blur function Each
  • 如何从导航抽屉启动活动?

    因此 我在这里搜索了有关导航抽屉的分配 当我从另一个人的问题的答案中找到教程时 我就这么做了 我成功地根据自己的喜好创建了导航抽屉并设计了其样式 但现在我一直在不知疲倦地寻找如何从导航抽屉启动活动 我已设法将一些代码放入 MainActiv
  • Angularjs:如何关闭评论块中的 ng-if ?

    div visible div 很容易 但是因为ngIf http docs angularjs org api ng directive ngIf甚至可以在评论中使用 结束语是什么评论区 尝试过 但运气不佳 Thanks ng if仅限于
  • Amazon S3 中的 Etag 定义已更改

    我使用 Amazon S3 进行备份已经有一段时间了 通常 上传文件后 我会检查 MD5 和匹配 以确保我已进行良好的备份 S3 具有用于给出此总和的 etag 标头 然而 当我最近上传一个大文件时 Etag 似乎不再是 md5 和 它有额
  • 使用替换密码进行加密

    我正在用字母表中的另一个字母替换字母表中的每个字母 例如 每个 a 都会替换为 Q 每个 b 都会替换为 W 我已经编写了代码来加密下面的句子 include
  • 截取 UIView 的屏幕截图,其中子视图是相机会话

    我正在构建一个应用程序 我需要对其子视图是相机会话 AVFoundation 会话 的视图进行屏幕截图 我试过这段代码 CGRect rect self containerView bounds UIGraphicsBeginImageCo
  • 将多个值作为单个参数传递 - Oracle SQL 查询

    我有一个查询 我传递了 2 个参数 COUNTRY REGION 参数和 COST CENTER 参数 我可以同时传递两个参数 COST CENTER 和 COUNTRY REGION 或者传递一个或另一个 这部分没问题 你可以在下面的第一
  • 使用 python 中的请求与不和谐交互

    我正在尝试使用 requests 和 python 自动点击不和谐按钮 但是当我发送请求时出现错误 不和谐按钮 https i stack imgur com tehay png 我试过这个 header authorization XXX
  • 使用 Java Web 服务的 Objective C SOAP 请求

    我有一个简单的 Java Web 服务 WebService serviceName Catalogo V1 public class Catalogo V1 This is a sample web service operation W
  • 除非我显式调用 AnnotationDriver::getAllClassNames,否则 Doctrine 不起作用

    我是第一次尝试使用 Doctrine ORM 并且我正在遵循此处找到配置 http www doctrine project org docs orm 2 0 en reference configuration html obtainin
  • 如何从 C# 将 SQL Server 数据库转换/导出到 MSAccess

    我有一个 SQL Server 数据库 我需要将所有数据导出到用户可以下载的 Access mdb 中 从 C 执行此操作的最简单方法是什么 我意识到我可以有一个空白 但有架构 mdb 当我想导出时我可以复制它 然后通过数据集将所有数据从
  • 是否“int size = 10;”产生一个常量表达式?

    以下代码在 gcc 4 8 和 Clang 3 2 下编译 int main int size 10 int arr size C 标准的8 3 4 1规定数组的大小必须是整型常量表达式 即size似乎不是 这是两个编译器中的错误 还是我遗