我对此代码的工作原理感到困惑:
struct S
{
char c[];
};
S s;
根据C ++标准,第8.3.4章:
“如果常数 表达式被省略,类型为 D的标识符是 “derived-declarator-type-list数组 未知的T“界限,不完整 对象类型。“
但我无法弄清楚“不完整的对象类型”是如何完成的。
感谢您的帮助!
答案 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;