三元表达式省略中间操作符
下面两种表达方式等价
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;
}
参考: