C 在没有赋值的情况下初始化结构?
我在互联网上找不到这个问题的答案,所以我的问题是:我可以定义一个struct实例而不将它分配给C中的局部或全局变量吗?例如: 结构A{ int b; } 构造一个foo(){ 返回结构A{.b=42}; }C 在没有赋值的情况下初始化结构?,c,variables,struct,initialization,C,Variables,Struct,Initialization,我在互联网上找不到这个问题的答案,所以我的问题是:我可以定义一个struct实例而不将它分配给C中的局部或全局变量吗?例如: 结构A{ int b; } 构造一个foo(){ 返回结构A{.b=42}; } 如果这是不可能的:为什么?是的,这是可能的,因为C99。这是一个复合文字 不过,你的语法还是错误的。使用: (struct A){.b=42} 或 不过,如果不重要,请选择常量文字: (const struct A){.b=42} 所有常量文字都受常量池的约束(包括由于历史原因而具有类
如果这是不可能的:为什么?是的,这是可能的,因为C99。这是一个复合文字 不过,你的语法还是错误的。使用:
(struct A){.b=42}
或
不过,如果不重要,请选择常量文字:
(const struct A){.b=42}
所有常量文字都受常量池的约束(包括由于历史原因而具有类型char[]
的字符串文字)。常量复合文字和任何函数外的复合文字具有静态存储持续时间,
其余的具有自动存储持续时间(注意返回指针,并且每次都必须对其进行初始化)
总之,在可能的情况下,您可以选择常量文字。是的,您可以在C99及更高版本中使用复合文字
return (struct A) { .b = 42 };
您甚至可以指向它们:
struct A *a = &(struct A) { .b = 42 };
a->b = 43;
这些文字比字符串文字“更好”,因为它们是可写的。当且仅当您在文本的类型中包含
const
时,编译器才可以将它们合并到一起。是C99为此()提供了复合文本:
这在第6.5.2.5节“复合文字”中介绍,并说明:
由括号中的类型名和括号中的初始值设定项列表组成的后缀表达式是复合文字。它提供了一个未命名的对象,其
值由初始值设定项列表给出。84)
以及:
复合文字的值是由初始化的未命名对象的值
初始化列表。如果复合文字出现在函数体之外,则对象
具有静态存储时间;否则,它将具有与关联的自动存储持续时间
封闭块
并提供了几个示例,包括:
示例3具有名称的初始值设定项可以与复合文字组合。结构对象
使用复合文字创建的文本可以传递给函数,而不依赖于成员顺序:
gcc
在它的扩展部分也有一个关于这一点的说明,因为它支持C99之外的这一功能以及clang
顺便说一句,不带参数的函数应该有(void)
作为参数,否则就不会形成原型,编译器将允许您使用参数调用它(导致未定义的行为)@Matt MCNabb谢谢你的提示,我绝对没有意识到!你也可以做return(struct A){42}当然,虽然我认为他想使用指定的初始值设定项,以避免在A
添加其他成员时出错。是的,在这种情况下,最好是明确的。
struct A *a = &(struct A) { .b = 42 };
a->b = 43;
return (struct A) { 42 } ;
drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});