A a =(A)b中是否需要显式类型转换;

时间:2014-10-16 15:23:49

标签: c

我正在阅读一些开源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中是否需要显式类型转换?

6 个答案:

答案 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