【问题标题】:C++ standard - how "array of unknown bound of T" is treatedC++ 标准 - 如何处理“T 的未知边界数组”
【发布时间】:2010-09-24 11:33:35
【问题描述】:

我对这段代码有效的事实感到困惑:

struct S
{
  char c[];
};
S s;

根据 C++ 标准,第 8.3.4 章:

"如果常数 表达式被省略,类型 D 的标识符是 “派生声明符类型列表数组 T”的未知界,一个不完整的 对象类型。”

但我无法弄清楚“不完整的对象类型”是如何变得完整的。

感谢您的帮助!

【问题讨论】:

  • 欢迎来到 SO,在提出问题时,您可以使用顶部的按钮(1010 等)来格式化代码并正确引用您的问题部分。
  • 很好的链接。根据其中一个答案,它不应该编译。我已经在 gcc 4.4.4 (-ansi) 和 VC2010 上尝试了我的代码并且都编译了。
  • 在 GCC 中尝试 -pedantic-ansi - 如果您不指定 -pedantic,它会启用许多与有效 C++ 不冲突的语言扩展。跨度>
  • 带有 -pedantic 的 Gcc 给出“零大小数组”的警告,但可以编译

标签: c++ arrays standards


【解决方案1】:

您说过您发布的代码将在 VS10 中编译。关闭语言扩展,然后就不会了。项目>属性>C/C++>语言>禁用语言扩展=是。这是编译,因为您使用的是特定于 MS 的 C++ 语言扩展。

简而言之,按照标准,你的代码不应该编译。

【讨论】:

  • "当数组用作非静态成员的类型时,应指定所有维度。" (9.2/8)
【解决方案2】:

似乎发明了这种语言功能是为了允许稍后在源文件中初始化数组。如果我将c设为非静态,那么至少在Visual Studio 2010上编译失败,说c的长度已固定为0,不允许重新声明成员。

// header file
struct S
{
    static char c[];
    static size_t len;
};
extern S s;

// source file
char S::c[] = "haha";
size_t S::len = (sizeof(S::c) / sizeof(S::c[0])) - 1;

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 2014-11-08
    • 2021-08-27
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2014-12-22
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多