C ++标准 - 如何处理“T的未知边界数组”

时间:2010-09-24 11:33:35

标签: c++ arrays standards

我对此代码的工作原理感到困惑:

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

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

  

“如果常数   表达式被省略,类型为   D的标识符是   “derived-declarator-type-list数组   未知的T“界限,不完整   对象类型。“

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

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

简而言之,根据标准,您的代码不应该编译。

答案 1 :(得分:0)

似乎发明了这种语言特性是为了允许稍后在源文件中初始化数组。如果我使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;