C99之复合字面量

Posted on Mar 12, 2023
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;
}

参考

C语言复合字面量应该如何使用?


留言或评论请使用 Github Issues