我一直在使用类似的代码在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进行编译会产生一些运行时问题吗?
答案 0 :(得分:5)
在C中,void指针非常常见,丢弃类型信息通常更常见,因为尝试保持所有类型安全更加麻烦。因为void指针是如此常见,不得不经常进行转换会很麻烦,甚至可能更容易出错。
在C ++中,void指针更为罕见。继承和模板等功能提供了更好的替代方案。因此,当实际使用时,C ++可以对void指针的使用更加严格。 C ++的void指针概念有点像“指向任何对象的指针”,因此将任何对象指针转换为“指向任何对象的指针”是完全安全的。走另一条路并不是那么安全。它依赖于程序员只在适当时才这样做,但为了避免事故,需要明确的演员。
答案 1 :(得分:4)
因为C ++是强类型的(不像C有一些弱的输入特性,主要是因为它处理的隐式类型转换),并且所有可能改变值的语义的类型转换都应该明确地进行,就像在页面:http://www.cplusplus.com/doc/tutorial/typecasting/。