不会代表其他编译器,但在GNU GCC编译器中,您可以使用以下语法静态初始化数组:
struct some_struct {
unsigned *some_array;
} some_var = {
.some_array = (unsigned[]) { 1u, 2u, 3u, 4u, 5u, },
};
首先,我遇到了这种语法,搜索了我所关注的问题的答案,然后来到this回答。但我还没有找到任何GNU参考的链接,它涵盖了这种语法。
如果有人与我分享关于此语法的链接,我将非常感激。谢谢!
答案 0 :(得分:2)
好吧,如果您的问题是关于复合文字语法,那么这里的一个重要细节是您没有在结构中初始化数组。您正在初始化结构中的指针。您现在拥有的代码是正式的。
如果你的结构中确实有一个数组,那么使用复合文字进行初始化是行不通的。您无法从另一个数组初始化数组。数组不可复制(字符串文字中的char
数组初始化除外)。但是,在这种情况下,您可以使用普通的{}
封闭的初始化程序,而不是复合文字。
另请注意,复合文字(unsigned[]) { 1u, 2u, 3u, 4u, 5u, }
的生命周期取决于它出现的范围。如果在本地范围内执行上述操作,则复合文字数组将在块的末尾被销毁。
答案 1 :(得分:1)
您不太可能在此找到很多GNU文档,因为它不是GCC扩展 - 这是标准C语法的一部分,称为复合文字。它在C standard中的6.5.2.5和6.7.9节中定义(后者涵盖了大括号之间的部分,对于复合文字和静态初始化器都是相同的,所以标准只描述了一次)
您也可以使用此语法来描述动态对象值,而不仅仅是静态初始化,甚至可以单独站在表达式中而不必分配给任何变量。复合文字基本上可以出现在变量名称可以出现的任何地方:您可以将它们传递给函数,创建它们只是为了访问一个元素,获取它们的地址(您甚至可以将分配给它们,尽管它可以#39这不是很明显的有用的方法。
语法在所有C值类型中是统一的,可用于创建数组(指定要使用[N]=
设置的特定元素),结构和联合(使用.field=
指定特定元素)甚至数字类型(没有元素,所以不要指定,只需将值放在大括号之间)。语法旨在简单且一致,以便生成宏和代码生成器(除了优雅地手动编写)。