我正在阅读一些开源C代码,并多次遇到A a = (A) b;类型转换.例如,
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++中,赋值操作符会自动处理=的类型转换?因为它已经知道a是A类型的。
在C中是否需要显式类型转换?
发布于 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的指针,左边所指向的类型具有所有由右指向的类型的限定符。
发布于 2014-10-16 15:29:26
情况正好相反:在C++中,强制转换是绝对必要的,但在C中则不是必要的。
这个将在C中编译,但是不在C++
static void hexdump(const void* pv, int len) {
const unsigned char* p = pv;
...
}发布于 2014-10-16 15:27:48
在C中,它不是必需的,但在某些情况下,它有助于为隐式强制转换提供无声的编译器警告。
然而,在C++中,需要显式转换才能将空指针强制转换为不同类型的指针。
https://stackoverflow.com/questions/26408150
复制相似问题