不完整的数组类型 用于着名的 Struct hack ,自c99起允许使用标准。在c99标准之前,这些是不允许的。我正在看标准,我无法得出结论:
结构外是否允许不完整的数组类型?(我在标准C99中找到的所有引用:6.7.2.1.15将它作为结构中的最后一个元素)。
以下程序允许按照标准编译吗?
int array[];
int main(){return 0;}
我的问题的第二部分是,如果允许,array
保证能够存储 至少一个 元素的int
}。
答案 0 :(得分:3)
是否允许按照标准编译以下程序?
是的,按照:
(C99,6.9.2p5)“示例2如果在翻译单元的末尾包含 int i []; 数组我仍然有不完整的类型,隐式初始化器 导致它有一个元素,在程序中设置为零 启动“。
所以
int array[];
int main(){return 0;}
有效且等同于:
int array[1];
int main(){return 0;}
请注意,只有当array
具有(如上所述)外部链接时才可以:
(C99,6.9.2p3)“如果对象的标识符声明是暂定的并且具有内部链接,则声明的类型不应是不完整的类型。”