我正在阅读一些开源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中是否需要显式类型转换?
答案 0 :(得分:4)
不,从C中的void*
转换为char*
(它是common example以解释它们的不同之处!)是隐式的,因此无需投射(然后错误< / em>因为如果您错误地将char
更改为int
),它可能会隐藏问题。
由K&amp; R引用“ The C Programming Language ,2nd edition”(§A.6.8):
任何指向对象的指针都可以转换为void *类型而不会丢失信息。如果结果转换回原始指针类型,则恢复原始指针。与Par.A.6.6中讨论的指针到指针转换(通常需要显式转换)不同,指针可以分配给void *类型的指针,也可以与它们进行比较。
请注意“如果结果转换回原始指针类型”因为至关重要:如果您char*
代替int*
,那么可能由于内存对齐而错误。
从C99标准(§6.3.2.3)了解何时可以进行转换:
指向void的指针可以转换为指向任何不完整或对象类型的指针。指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回;结果应该等于原始指针。
现在让我们看看何时可以隐含(感谢mafso进行快速搜索),来自C11(n1570)§6.5.4p3:
涉及指针的转换,除了6.5.16.1的约束允许的范围外,应通过显式转换来指定。
然后§6.5.16.1:
以下之一应该成立:[...]左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象的指针type,另一个是指向void的限定或非限定版本的指针,左边指向的类型具有右边指向的所有类型的限定符
答案 1 :(得分:4)
你已经反过来了:在C ++中,强制转换是绝对必要的,但在C中没有必要。
此will compile in C,但not in C++:
static void hexdump(const void* pv, int len) {
const unsigned char* p = pv;
...
}
答案 2 :(得分:2)
在C中没有必要,但在某些情况下,它有助于隐式编译器的静默编译器警告。
在C ++中,您需要显式强制转换才能将void指针强制转换为不同类型的指针。
答案 3 :(得分:1)
在我的练习中,一开始没有施放,虽然有编译器警告,但在测试通过后,添加了施法来消除警告。
答案 4 :(得分:0)
在这种情况下,你正在进行演员表演。
你只是在说编译。嘿,我确定这是一种类型(A)。
编译器检查C ++样式转换。 C样式强制转换并不会在运行时失败
答案 5 :(得分:0)
它被称为演员。这意味着它在(A)类型中转换b。
char c = 'a'; // c is a char
int b = (int) c // you tell your compiler to interpret c as an int