【问题标题】:C++11 array declaration example from 8.3.4p4 doesn't match gcc or clang?来自 8.3.4p4 的 C++11 数组声明示例与 gcc 或 clang 不匹配?
【发布时间】:2013-11-21 18:49:59
【问题描述】:

这是 C++11 示例的子集(与最新草案相同)8.3.4p4 ([dcl.array]/4):

extern int x[10];                   // 1

int x[]; // OK: bound is 10         // 2

void f() {
    extern int x[];                 // 3
    int i = sizeof(x); // error incomplete type
}

gcc 不同意错误并给出:

error: type mismatch with previous external decl of ‘int x []’

改为(在声明 3 处)。

clang 编译没有错误。

我的解释是该示例格式正确。声明 3 应该链接到声明 1 和 2,因此应该具有类型 array of 10 int,而不是 array of unknown bound int。所以在sizeof应该是完整的。

谁是正确的?标准,gcc 还是 clang?

【问题讨论】:

  • 也许添加编译器版本?
  • gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1),clang 版本 3.0-6ubuntu3
  • 好的。我用clang 3.4对其进行了测试,它与sizeof fail一致。

标签: c++ c++11


【解决方案1】:

8.3.4/3 包括:

此外,如果在指定边界的同一范围内存在实体的先前声明,则省略的数组边界将被视为与先前声明中的相同,

由于函数内部的声明与不适用的全局声明不在同一范围内,因此不授予省略数组绑定的权限。我也没有看到任何其他允许省略的文本,因此sizeof(x) 表达式中的x 类型不完整。

Clang 不应该接受代码,gcc 出于错误的原因拒绝它,标准的示例对我来说看起来很准确。

【讨论】:

  • 您是否考虑了 extern 说明符?这将其链接到前两个声明。所有三个声明都引用同一个对象。
  • 使用最新版本的 gcc 和 clang 进行测试,看起来错误符合标准。
  • @AndrewTomazos 是的,extern 声明确实只是重新声明了全局定义的数组,因此引用了同一个对象,但这并不意味着它们在完成方面都具有相同的状态类型。
猜你喜欢
  • 2023-03-15
  • 2012-12-07
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2013-07-31
  • 2015-03-01
相关资源
最近更新 更多