我正在阅读一些开源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中是否需要显式类型转换?
不,在C中从转换void*
为char*
C(这是一个常见的示例,以说明它们之间的不同!)是隐式的,因此无需进行强制转换(然后出错,因为如果您错误地更改char
为,可能会隐藏问题int
)。
引用由K&R(§A.6.8)撰写的“ C编程语言,第二版” :
任何指向对象的指针都可以转换为void *类型,而不会丢失信息。如果将结果转换回原始指针类型,则将恢复原始指针。与通常需要显式转换的第A.6.6节中讨论的指针到指针的转换不同,可以将指针分配给void *类型的指针或从指针中分配指针,并将指针与它们进行比较。
请注意“如果将结果转换回原始指针类型”,这是至关重要的:如果不是char*
您的结果,int*
则可能由于内存对齐而出错。
根据C99标准(第6.3.2.3节),何时可以进行转换:
指向void的指针可以转换为任何不完整或对象类型的指针或从该指针转换为任何不完整或对象类型的指针。指向任何不完整或对象类型的指针都可以转换为指向void的指针,然后再次返回。结果应等于原始指针。
现在,让我们看看C11(n1570)§6.5.4p3中何时可以隐式表示(感谢mafso进行了快速搜索):
除6.5.16.1的约束所允许的地方外,涉及指针的转换应通过显式强制转换来指定。
然后§6.5.16.1:
满足以下条件之一:[...]左操作数具有原子,限定或不限定的指针类型,并且(考虑到左操作数在左值转换后将具有的类型),一个操作数是指向对象类型的指针,并且另一个是指向void的合格或不合格版本的指针,并且左侧指向的类型具有右侧指向的类型的所有限定符
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句