当前位置:  开发笔记 > 编程语言 > 正文

带有类型或变量的"C"sizeof

如何解决《带有类型或变量的"C"sizeof》经验,为你挑选了2个好方法。

最近看到有人赞扬另一个用户使用sizeof var而不是sizeof(type).我一直以为这只是一种风格选择.有什么显着差异吗?例如,具有f和ff的线被认为比具有g和gg的线更好:

 typedef struct _foo {} foo;

 foo *f = malloc(count * sizeof f);
 foo *g = malloc(sizeof(foo) * count);

 foo **ff = malloc(count * sizeof *ff);
 foo **gg = malloc(sizeof(foo*) * count);

在我看来,第一组只是风格问题.但是在第二对线中,额外的第二个*很容易混淆乘法.



1> Steve Fallow..:

如果更改了变量的类型,则如果变量是参数而不是类型,则sizeof不需要更改.

关于@ icepack的评论:类型与变量名称的变化的可能性或可​​能性不是问题.想象一下,变量名称用作sizeof的参数,然后更改.在最好的情况下,重构重命名操作会更改所有实例,并且不会引入错误.在最坏的情况下,错过了sizeof的实例,编译器会抱怨并修复它.如果类型已更改,则表示已完成,sizeof语句不会出错.

现在假设类型是sizeof的参数.如果更改了变量的类型,则除了检查之外没有其他方法可以找到与该变量相关的所有sizeof.您可以搜索,但是您将获得相同类型sizeof的所有不相关用途的匹配.如果错过了一个,由于尺寸不匹配会导致运行时问题,这样找不到更多麻烦.


这不是一个看似合理的论点.以同样的方式,可以声称如果变量的名称被更改,如果类型是参数而不是变量,则sizeof将不需要更改.变更的可能性取决于具体的设计(在大多数情况下,既不会也不应该改变)

2> Johannes Sch..:

除了Steve所说的,让我补充一点,sizeof不会评估它的操作数.所以你可以自由地做任何事情.您不仅可以使用尚未初始化的变量,而且可以取消引用空指针,调用未定义但仅声明的函数,并执行任何其他类型的操作.我鼓励你总是使用表达式版本,因为史蒂夫解释得非常好.

还要考虑有时类型名称很长且不可读,只需考虑指向函数的指针(特别是在C++中).而不是写sizeof(my_long_type)你只是做sizeof t.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有