为什么c++中需要从void指针进行类型转换

Why typecast from void pointer is necessary in C++?

本文关键字:指针 类型转换 void c++ 为什么      更新时间:2023-10-16

我在嵌入式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 = %un", *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编译,它会产生一些运行时问题吗?

在C语言中,void指针非常常见,丢掉类型信息通常更常见,因为试图保持所有内容都是类型安全的更麻烦。由于void指针是如此普遍,必须不断地进行强制转换会很麻烦,甚至可能更容易出错。

在c++中,void指针要少见得多。继承和模板等特性提供了更好的选择。因此,在实际使用void指针时,c++可以对它们的用法更严格一些。c++中void指针的概念有点像"指向任何对象的指针",因此将任何对象指针转换为"指向任何对象的指针"是完全安全的。不过走另一条路就不那么安全了。它依赖于程序员只在适当的时候这样做,但是为了帮助避免意外,需要显式强制转换。

因为c++是强类型的(不像C有一些弱类型的特性,主要是因为它处理的隐式类型转换),所有可能改变值的语义的类型转换都应该显式地进行,就像该页所解释的那样:http://www.cplusplus.com/doc/tutorial/typecasting/.