如何使用复合字面量简洁初始化以NULL终止的结构体指针数组
如何使用复合字面量简洁初始化以NULL终止的结构体指针数组
没问题,我来帮你搞定这个代码简洁性的小痛点!
首先得明确一点:在**标准C(包括C99、C11及之后的版本)**里,复合字面量是必须显式声明类型的,所以你最初写的&(struct object) {1, 2}这种写法是符合标准的、可移植的正确写法。不过如果你想让代码更清爽,有两种实用思路可以走:
方案一:用typedef简化结构体类型名
如果觉得每次写struct object太啰嗦,可以先给结构体起个更短的别名,既能大幅减少重复代码,还完全符合标准,不会有可移植性问题:
typedef struct object Object; struct object { int data1; char data2; }; Object *object_array[] = { &(Object){1, 2}, &(Object){3, 4}, &(Object){5, 6}, &(Object){7, 8}, &(Object){9, 10}, NULL, };
把struct object简化成Object后,代码简洁度提升的同时,可读性也没打折扣。
方案二:利用编译器扩展实现极简写法
如果你只需要在GCC、Clang这类支持GNU扩展的编译器下开发,那可以用它们支持的「省略类型复合字面量」扩展,直接实现你想要的&{1, 2}这种极简写法。不过要注意,这种写法不属于标准C语法,换用不支持该扩展的编译器(比如标准模式下的MSVC)就会报错。
开启扩展后,你的代码可以写成这样:
struct object { int data1; char data2; }; struct object *object_array[] = { &{1, 2}, &{3, 4}, &{5, 6}, &{7, 8}, &{9, 10}, NULL, };
GCC默认就支持这个扩展,要是你想严格遵循标准C语法,编译时加上-pedantic参数就会触发警告,提醒你这是扩展语法。
最后总结下:如果追求跨编译器的可移植性,优先选typedef简化的方案;如果只在GCC/Clang环境下开发,且不在意标准兼容性,那直接用编译器扩展的极简写法就好。
内容来源于stack exchange
相关产品推荐
相关产品推荐

