观前叠甲:在看完本贴后你依旧可以爱咋写咋写。
也许你见到过这样的写法:
将所需类型重复写了三次,这显然不是很好的写法。
事实上,我们只需写一次:
现在,malloc分配的大小与p指向的类型关联起来了,我们不必再关心分配的大小,只需关心指针的类型。
更进一步地,我们可以为这种写法写一个便利宏:
十分优雅的写法。
但是这种写法并非完美,因为若sizeof的操作数是VLA类型的表达式,则会求值该表达式,进而可能导致UB。
例:
但也并非完全不能用,因为基本上不会有哪个实现会在上例的语境中真的给你解引用指针,这样做不会对类型大小的计算有任何的帮助,不是吗?只是根据标准,它是UB。
在即将到来的C23标准下,我们可以有更加完美且优雅的写法:
给定类型,获得指向该类型的指针,有C++内味儿了。
事实上,在C23前也能够这样写,C23中的typeof和auto源于编译器的非标准实现,如gcc和clang都实现了typeof和__auto_type。
例:
最后,贴上相关示例代码:
gcc.godbolt.org/z/5EE567heE
也许你见到过这样的写法:
将所需类型重复写了三次,这显然不是很好的写法。
事实上,我们只需写一次:
现在,malloc分配的大小与p指向的类型关联起来了,我们不必再关心分配的大小,只需关心指针的类型。
更进一步地,我们可以为这种写法写一个便利宏:
十分优雅的写法。
但是这种写法并非完美,因为若sizeof的操作数是VLA类型的表达式,则会求值该表达式,进而可能导致UB。
例:
但也并非完全不能用,因为基本上不会有哪个实现会在上例的语境中真的给你解引用指针,这样做不会对类型大小的计算有任何的帮助,不是吗?只是根据标准,它是UB。
在即将到来的C23标准下,我们可以有更加完美且优雅的写法:
给定类型,获得指向该类型的指针,有C++内味儿了。
事实上,在C23前也能够这样写,C23中的typeof和auto源于编译器的非标准实现,如gcc和clang都实现了typeof和__auto_type。
例:
最后,贴上相关示例代码:
gcc.godbolt.org/z/5EE567heE