首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是A_a= (A) _b中必需的显式类型转换;

是A_a= (A) _b中必需的显式类型转换;
EN

Stack Overflow用户
提问于 2014-10-16 15:23:48
回答 6查看 180关注 0票数 1

我正在阅读一些开源C代码,并多次遇到A a = (A) b;类型转换.例如,

代码语言:javascript
运行
复制
static void hexdump(const void* pv, int len)
{
  const unsigned char* p = (const unsigned char*) pv;
  // some other code
}

A a = (A) b;代码主要发生在b是指针时,void *指针最常见。我有C++背景。我认为在C++中,赋值操作符会自动处理=的类型转换?因为它已经知道aA类型的。

在C中是否需要显式类型转换?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-10-16 15:29:01

不,用C语言将void*转换为char* (这是一个常见例子,用来解释它们的不同之处!)是隐式的,因此转换是不必要的(然后错误,因为如果您错误地将char更改为int,它可能会隐藏问题)。

引用K&R的“C编程语言第二版”(§A.6.8):

指向对象的任何指针都可以转换为void*类型,而不会丢失信息。如果结果被转换回原始指针类型,则恢复原始指针。不同于第A.6.6部分中讨论的指针到指针的转换(通常需要显式转换),指针可以分配给类型为void*的指针,也可以从类型为void*的指针中分配,并且可以与它们进行比较。

请注意“如果结果被转换回原来的指针类型”,因为这是至关重要的:如果不是char*,而是int*,那么它可能是错误的,因为内存对齐。

根据C99标准(§6.3.2.3),何时可以进行转换:

指向空的指针可以转换为指向任何不完整类型或对象类型的指针,也可以从指针转换为指向对象类型的指针。指向任何不完整或对象类型的指针可以再次转换为无效指针和返回指针;结果应与原始指针相比较。

现在让我们看看什么时候可以隐式(感谢mafso非常快速的搜索),来自C11 (n1570) §6.5.4p3

除6.5.16.1约束允许的情况外,涉及指针的转换应通过显式转换方式指定。

然后§6.5.16.1

下列一项应适用:左操作数具有原子的、限定的或不限定的指针类型,并且(考虑到左操作数在lvalue转换后将具有的类型),一个操作数是指向对象类型的指针,另一个操作数是指向限定或非限定版本的void的指针,左边所指向的类型具有所有由右指向的类型的限定符。

票数 4
EN

Stack Overflow用户

发布于 2014-10-16 15:29:26

情况正好相反:在C++中,强制转换是绝对必要的,但在C中则不是必要的。

这个将在C中编译,但是不在C++

代码语言:javascript
运行
复制
static void hexdump(const void* pv, int len) {
  const unsigned char* p = pv;
  ...
}
票数 4
EN

Stack Overflow用户

发布于 2014-10-16 15:27:48

在C中,它不是必需的,但在某些情况下,它有助于为隐式强制转换提供无声的编译器警告。

然而,在C++中,需要显式转换才能将空指针强制转换为不同类型的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26408150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档