C99之复合字面量
tl;dr:
(type){xxx} 的形式定义临时对象。
语法
C99 允许采用 type-name{initializer-list}
这样类似 C++ 的构造函数的形式构造匿名的结构体,即复合文字特性。如(int[]){1,3},(int){1}
,复合字面量是匿名的,所以不能先创建然后再使用,必须在创建的同时使用。
复合字面量的值类别是左值(能取其地址)。
若复合字面量出现于文件作用域,则其求值所得的无名对象拥有静态存储期,若复合字面量出现于块作用域,则该对象拥有自动存储期(此情况下对象的生存期结束于外围块的结尾)。
示例
#include <stdio.h>
#include <inttypes.h>
void func(int32_t *a, int32_t *b)
{
*a = *b;
}
int main(void)
{
int32_t a;
func(&a,&((int){3}));
printf("%i\n",a);
}
匿名数组:
int main()
{
int total;
total = sum((int[]) { 4, 4, 4, 5, 5, 5 }, 6);
return 0;
}
int sum(const int age[], int n)
{
int i = 0;
for (i = 0; i < n; i++) {
printf("age is %d\n", age[i]);
}
}
匿名结构体:
#include <stddef.h>
#include <stdio.h>
struct stu{
size_t no;
char gender;
float score;
};
void func(struct stu s[], size_t length)
{
for (size_t i = 0; i < length; i++)
{
printf("no:%zu, gender: %c, score: %f\n",s[i].no,s[i].gender,s[i].score);
}
}
int main(int argc, char const *argv[])
{
func((struct stu[]){{1,'M',32.5},{2,'F',23.9}},2);
return 0;
}
参考
留言或评论请使用 Github Issues。