3

我在 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 编译会产生一些运行时问题吗?

4

2 回答 2

5

在 C 中,void 指针非常常见,而丢弃类型信息通常更常见,因为尝试保持所有内容类型安全更麻烦。因为 void 指针很常见,所以必须不断地进行强制转换会很麻烦,甚至更容易出错。

在 C++ 中,空指针更为罕见。继承和模板等特性提供了更好的选择。因此,在实际使用 void 指针时,C++ 可以对它们的使用更加严格一些。C++ 的 void 指针概念有点像“指向任何对象的指针”,因此将任何对象指针转换为“指向任何对象的指针”是完全安全的。不过,走另一条路并不那么安全。它依赖于程序员仅在适当的时候执行此操作,但为了帮助避免意外,需要显式转换。

于 2013-06-09T20:06:46.497 回答
4

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

于 2013-06-09T20:03:37.310 回答