最近看到有人赞扬另一个用户使用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);
在我看来,第一组只是风格问题.但是在第二对线中,额外的第二个*很容易混淆乘法.
如果更改了变量的类型,则如果变量是参数而不是类型,则sizeof不需要更改.
关于@ icepack的评论:类型与变量名称的变化的可能性或可能性不是问题.想象一下,变量名称用作sizeof的参数,然后更改.在最好的情况下,重构重命名操作会更改所有实例,并且不会引入错误.在最坏的情况下,错过了sizeof的实例,编译器会抱怨并修复它.如果类型已更改,则表示已完成,sizeof语句不会出错.
现在假设类型是sizeof的参数.如果更改了变量的类型,则除了检查之外没有其他方法可以找到与该变量相关的所有sizeof.您可以搜索,但是您将获得相同类型sizeof的所有不相关用途的匹配.如果错过了一个,由于尺寸不匹配会导致运行时问题,这样找不到更多麻烦.
除了Steve所说的,让我补充一点,sizeof不会评估它的操作数.所以你可以自由地做任何事情.您不仅可以使用尚未初始化的变量,而且可以取消引用空指针,调用未定义但仅声明的函数,并执行任何其他类型的操作.我鼓励你总是使用表达式版本,因为史蒂夫解释得非常好.
还要考虑有时类型名称很长且不可读,只需考虑指向函数的指针(特别是在C++中).而不是写sizeof(my_long_type
你只是做sizeof t
.