C语言中如何在未知变量类型时将其初始化为默认零值?
你可以利用C99引入的复合字面量特性,直接将返回值初始化为对应类型的零值,不需要提前知道具体类型,修改成本极低。
只需要修改STACK_POP宏的变量声明行,在声明ret时直接用对应类型的复合字面量初始化即可:
#define STACK_POP(stack) ({\ typeof(*(stack).data) ret = (typeof(*(stack).data)){0};\ if ((stack).size) ret = (stack).data[(stack).capacity - (stack).size--];\ ret;\ })
原理说明
- 语法
(类型){0}是C标准定义的复合字面量写法,对任意可赋值类型(整数、浮点数、指针、结构体等)都生效,会自动将所有位初始化为零值:整数得到0、指针得到NULL、结构体所有成员都会被置零,完全适配你泛型栈的任意类型需求。 - 修改后
ret变量在声明时就完成了初始化,不管栈是否为空都不会出现未初始化的情况,完全可以通过-Wall -Wextra -Werror的编译检查。
注:这个修改的适用范围和你原本的栈实现完全一致,C语言本身不支持数组直接赋值,所以原本的栈也不支持存储数组类型,这个限制和本次修改无关。
内容的提问来源于stack exchange,提问作者Fayeure
相关产品推荐
相关产品推荐

