为什么c++中需要从void指针进行类型转换
Why typecast from void pointer is necessary in C++?
我在嵌入式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/.
相关文章:
- C++中的双指针类型转换
- 将类指针类型转换为键时出错
- 指针类型类成员的动态强制转换的恒定性是什么?
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 派生到基本隐式指针类型转换
- 将函数指针类型转换为相应的字符串
- Vulkan API 调试函数指针类型转换错误
- 如何将方法指针类型转换为函数指针类型
- 如何将 void 指针类型转换为 int 指针,然后在其中存储 int
- 将指针类型转换为int会崩溃
- 将void指针类型转换为int时出现分段错误
- 查找尾序指针类型转换的代码
- 提取2个指针类型转换为(void*)
- c++中指针类型转换的解释
- C++ 多态性和派生类类型 - "ugly programming"指针类型转换
- c++ /CLI双指针类型转换为ref IntPtr,用于c#访问
- 带和不带引用的指针类型转换
- 将普通指针类型转换为unique_ptr类型是一种不好的做法吗?