GNU C 的扩展特性汇总(持续补充)

三元表达式省略中间操作符

下面两种表达方式等价

x ? : y
x ? x : y

零长度数组

GNU C 允许零长度数组。零长度数组作为结构体的最后一个元素,代表这个数组长度可变。

/* ISO C90 规范 */
struct line
{
	int len;
	char contents[0];
};

ISO C99 使用柔性数组成员(Flexible array members),语法和语义有些许区别:

  • 柔性数组成员省略长度 0,写为 contents[]。
/* ISO C99 规范 */
struct foo
{
    int x;
    int y[];
};
  • 柔性数组成员具有不完整的类型,不适用于 sizeof。当使用 sizeof 时,柔性数组成员的长度计算为零。
struct foo a = {1, {2,3,4}};

printf("%ld\n", sizeof(struct foo)); /* 4 */
printf("%ld\n", sizeof(a)); 		 /* 4 */
  • 柔性数组成员只能作为结构体的最后一个元素。

简单示例,示例参考 git 源码:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

struct cache_entry {
    unsigned int st_ino;
    unsigned short namelen;
    unsigned char name[];
};

/* 考虑对齐  */
#define cache_entry_size(len) ((offsetof(struct cache_entry,name) + (len) + 8) & ~7)
#define ce_size(ce) cache_entry_size((ce)->namelen)

int main(void)
{
    int size, namelen;
    char *path;
    struct cache_entry *ce;

    path = "test.file";

    namelen = strlen(path);
    size = cache_entry_size(namelen);

    ce = malloc(size);
    memset(ce, 0, size);

    ce->st_ino = 123;
    ce->namelen = namelen;
    memcpy(ce->name, path, namelen);

    return 0;
}

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylhw13_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值