【问题标题】:Use of sizeof in declerations [duplicate]在声明中使用 sizeof [重复]
【发布时间】:2021-10-19 09:16:01
【问题描述】:

我看到了形式的声明

int *p3 = calloc(4, sizeof *p3);

在某些代码中。使用这种 decleration 而不是命名类型有什么好处

int *p3 = calloc(4, sizeof(int));

【问题讨论】:

  • 首先,如果您要将p3 的类型更改为其他类型,则无需更改sizeof。出错的可能性较小。

标签: c


【解决方案1】:

简单:

如果有人出现并将p3 的类型更改为int 以外的类型怎么办?如果他们忘记更改初始化程序中重复提及的int,那么您现在很难找到错误。

使用sizeof *p3 时,不会发生这种情况。

代码中的冗余可以是好的;但事实并非如此,因为这里的冗余不是由编译器保证的,无助于使代码更清晰,也没有其他用途。

【讨论】:

  • 如果维护代码的人将sizeof *p3 更改为*p3 以外的其他内容怎么办?我不明白为什么这比他们更改声明的类型更不可能。我也主要支持sizeof *p3 风格,但事实是支持/反对它的论点非常主观。基本上没有办法保护程序员免受他们自己的伤害——如果维护代码的人不知道他们在做什么,那么世界上没有任何聪明的技巧可以拯救他们。
  • @Lundin 我不明白在什么情况下会发生这种变化。更有可能的是有人会更改声明中的变量名。但这通常不会成为问题:因为如果他们忘记更改 sizeof 表达式,代码现在将无法编译。 ——所以我不同意你的观点,这完全是主观的:它将一个相当常见的错误来源换成了一个非常罕见的错误来源。你的最后一点评论只有 C 程序员才能说,对不起:许多其他语言非常有效地保护程序员免受自己的伤害。
  • @Lundin:问题“如果维护代码的人将sizeof *p3 更改为*p3 以外的其他内容怎么办?”没有意义,因为除了一些与代码目的无关的完全随机的输入错误之外,没有其他理由发生这种情况。一旦一个人采用了使用sizeof *p 的习惯用法,其中p 是被分配的东西,就没有理由在那里使用其他任何东西。不会写sizeof *p[3]sizeof **psizeof -*p 或其他任何东西。这就像说我们不应该使用+ 进行加法,因为可能会写错操作数。
  • @Lundin:关于“基本上没有办法保护程序员免受自己的伤害”:那是错误的。有很多方法可以保护程序员免受自己的伤害。编译器诊断消息通常会保护程序员免受他们自己的伤害。采用模式和习语有助于保护程序员免受自己的伤害。清晰的文档有助于保护程序员免受自己的伤害。测试有助于保护程序员免受自己的伤害。有多种工具可以帮助减少人为错误。
  • @EricPostpischil 明显的原因包括:分配数组而不是单个项目,sizeof *p3 * n。这反过来很容易以多种方式搞砸,例如sizeof(*p3 * n)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 2012-10-24
  • 1970-01-01
  • 2016-10-22
  • 2012-11-04
  • 1970-01-01
相关资源
最近更新 更多