为什么在C ++中必须使用void指针进行类型转换?

时间:2013-06-09 19:58:19

标签: c++ c

我一直在使用类似的代码在Embedded C中多次跟随。

#include <stdio.h>

int g_uArray[5] =
{ 1, 1, 2, 3, 5};

void* foo( int uIndex );

int main()
{
    int* uVar;
    uVar = foo( 2 );
    printf( "Value = %u\n", *uVar );
    return 0;
}

void* foo( int uIndex )
{
    return (void*) &g_uArray[uIndex];
}

上面的代码在使用gcc编译时非常有效,但在使用g ++编译时会抛出错误

invalid conversion from ‘void*’ to ‘int*’

换行

uVar = foo( 2 );

但是可以通过给出-fpermissive标志来编译它。 现在,我的问题是为什么C ++给出错误是非常重要的(gcc -Wall甚至没有给出警告)。 如果我使用-fpermissive进行编译会产生一些运行时问题吗?

2 个答案:

答案 0 :(得分:5)

在C中,void指针非常常见,丢弃类型信息通常更常见,因为尝试保持所有类型安全更加麻烦。因为void指针是如此常见,不得不经常进行转换会很麻烦,甚至可能更容易出错。

在C ++中,void指针更为罕见。继承和模板等功能提供了更好的替代方案。因此,当实际使用时,C ++可以对void指针的使用更加严格。 C ++的void指针概念有点像“指向任何对象的指针”,因此将任何对象指针转换为“指向任何对象的指针”是完全安全的。走另一条路并不是那么安全。它依赖于程序员只在适当时才这样做,但为了避免事故,需要明确的演员。

答案 1 :(得分:4)

因为C ++是强类型的(不像C有一些弱的输入特性,主要是因为它处理的隐式类型转换),并且所有可能改变值的语义的类型转换都应该明确地进行,就像在页面:http://www.cplusplus.com/doc/tutorial/typecasting/