【问题标题】:Why explicity cast right side pointer operand if type matches left side operand?如果类型与左侧操作数匹配,为什么要显式转换右侧指针操作数?
【发布时间】:2013-01-22 17:09:54
【问题描述】:

关于 C 编程,我在示例代码中看到了几种情况,其中指针赋值涉及右侧操作数的显式转换,即使它已经与左侧操作数的类型匹配。举个例子:

void memcpy(u8int *dest, const u8int *src, u32int len)
{
    const u8int *sp = (const u8int *)src;
    u8int *dp = (u8int *)dest;
    for(; len != 0; len--) *dp++ = *sp++;
}

当然,函数也在头文件中正确声明为:

void memcpy(u8int * dest, const u8int * src, u32int len);

函数已经将变量“src”定义为类型“const u8int *”,那么为什么在分配给同样类型“const u8int *”的“sp”时要进行显式转换?将“dest”分配给“dp”也是如此。

【问题讨论】:

  • 没意义,也许有人刚刚学会了投射?
  • 写这样的代码的人可能太害怕宇宙噪声改变他的变量类型:-)
  • 他甚至不需要局部变量来查看这个函数的作用......
  • 认为这可能是一些奇怪的可移植性问题的结果,但很高兴知道大多数人都同意这毫无意义。这就是我希望听到的答案。

标签: c pointers casting variable-assignment


【解决方案1】:

如果你正在寻找一个神奇而神秘的理由来做这件事,你会失望的。这种类型的显式类型转换没有意义。

这是程序员的风格决定(而 IMO 是一个糟糕的决定)。类型转换有潜在的危险(通过“屏蔽”重要警告)并使代码更复杂阅读......它应该保留在需要的情况下。这不是其中之一。

【讨论】:

    【解决方案2】:

    当它们已经属于同一类型时,这样做没有用。当然,这是一种不好的做法。

    也许你读错书了。

    【讨论】:

      【解决方案3】:

      我的猜测是它只是查找/替换操作的剩余部分,没有理由这样做。

      【讨论】:

        【解决方案4】:

        他可能只是在虔诚地编写代码,背后没有任何意义(一种习惯)。

        好吧,只有编写此代码的程序员知道他在做什么(或者他不知道)。此函数可能会覆盖 string.h 中的 memcpy(),因为您不能拥有两个同名的函数。知道了这一点,他进入了危险的水域。如果你必须使用它,你也一样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-28
          • 2011-04-16
          • 2023-04-02
          • 2011-12-28
          • 1970-01-01
          相关资源
          最近更新 更多