【问题标题】:Why is it mandatory to explicitly typecast malloc and calloc in C++?为什么必须在 C++ 中显式类型转换 malloc 和 calloc?
【发布时间】:2023-03-30 11:30:01
【问题描述】:

我最近读到一篇文章说在 C 中没有必要显式地对 malloc 和 calloc 进行类型转换,但在 C++ 中这是强制性的。为什么会这样?谁能解释一下?

【问题讨论】:

  • 这能回答你的问题吗? Typecasting malloc C++
  • 我编辑了标签,因为您在询问 C++,但在 C 中有:Do I cast the result of malloc? 在 C 中,公认的智慧不仅是不必要的,而且是不受欢迎的
  • 另见this
  • 简短回答,因为 cpp 中的 void * 不会隐式转换,而在 C 中却可以。这就是语言的设计方式。
  • @gst: This question 并回答那种地址

标签: c++ malloc calloc


【解决方案1】:

因为在 C 中,您经常需要在各种情况下使用 void *。其中一些是用于回调的 cookie - 当您提供指向用户数据的指针并且您无法知道该数据类型时。或者像qsort() 这样的通用函数,它们必须在事先不知道它们的类型的情况下处理各种数据。在 C++ 中,尽管您不需要经常使用 void *,而在良好的安全代码中,您根本不需要使用它们,因为您有模板,因此您可以使用未知类型编写通用代码而没有不安全的转换。因此,C++ 的创建者希望激发对数据类型的正确使用,并确保当开发人员进行不安全的操作时,他/她/它/他们了解他/她/它/他们在做什么。

作为malloc()calloc() 返回void *,您必须在C++ 中显式转换它们。请注意,您不应该在 C++ 中使用它们,而是使用 operator new - 它已经返回正确的指针类型并且您不需要强制转换。甚至在现代 C++ 中,甚至不建议直接调用 new

【讨论】:

  • 喜欢这个答案!但是您可以编辑它以使用“她/他”甚至“他们”而不是“他”吗?更好的是,也许用“你”重写它?
  • @gst 当然,给你
【解决方案2】:

在 C 中,它给出了T *tp; U *up; void *vp;,可以说vp = tp; up = vp;,最后得到一个U*,它包含T 的地址,而不使用任何转换运算符。然而,C++ 的设计者希望确保在不使用至少一个显式转换运算符的情况下不会发生这样的事情。在大多数情况下,要求在指针表示为 void* 和实际使用它的时间之间使用转换运算符比在指针转换为 void* 时要求转换运算符要少麻烦,那就是C++ 做什么。但是,C 或 C++ 都不允许在 void* 之间进行任何语法区分,后者是通过将对象的地址转换为具有实际类型的地址而产生的,而后者用于保存没有类型的存储块地址,因此没有办法允许后者隐式转换为任何类型(这将是有用的)而不对前者做同样的事情(这是 C++ 的设计者不想要的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 2013-04-15
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多