"type-safety"在C++中的确切含义是什么?

What is the exact meaning of "type-safety" in C++?

本文关键字:是什么 type-safety C++      更新时间:2023-10-16

根据此站点:

您不能隐式从void*分配到任何其他类型。例如,以下内容在 c 中是完全有效的(实际上,这可以说是在C中进行的优选方法)

int *x = malloc(sizeof(int) * 10);

但不会在 c 中编译。

bjarne stroustrup 的解释本身是不是安全的。这意味着您可以拥有一个完全指向任何内容的void*,如果然后将存储在该void*的地址分配给其他类型的另一个指针,则根本没有任何警告。

考虑以下内容:

int an_int;
void *void_pointer = &an_int;
double *double_ptr = void_pointer;
*double_ptr = 5;
cout<<an_int<<endl;

当您分配*double_ptr值5时,它是编写8个字节的内存,但是整数变量an_int仅为4个字节。因此,当您打印an_int变量的值时,输出为0,因为根据4个字节编译器,选择最小的5(5.000 ..)的显着位,即0。

c 中,从空隙指针中强迫铸造使程序员注意这些东西。因此,用这种语言隐式类型的转换void *被禁止提供更强的类型安全性。

但是,当我将void *施放到double *中时,我真的很困惑:

int an_int;
void *void_pointer = &an_int;
double *double_ptr = (double *)void_pointer;
*double_ptr = 5;
cout<<an_int<<endl;

输出将保持不变为0。

那么,这里有什么角色型安全戏剧?Bjarne Stroustrup对类型安全的解释到底是什么?

'类型安全'意味着编译器不允许您使用非匹配类型进行操作,除非您明确要求这样做(例如,执行C风格或C reinterpret_cast<>类型铸件,就像您在样本中所做的一样)。

强静态类型安全是C 的核心元素。这基本上意味着您只能在兼容类型之间传输信息,而任何类型的最兼容类型是非常类型。这个想法以使用具有同一类层次结构的派生类型的基础类型的方式来加强,依此类推,依此类推,达到了巨大的复杂性和逻辑强度。还有一个核心的想法,即C 仍然与C尽可能兼容。其中一个掉了,是void *与任何指针类型兼容。不过,通常最好避免使用它,因为C 总是有更好的设计。

我无法抗拒。"类型安全性"是C 营销插科打。考虑以下代码:

#include <stdio.h>
class A {
public:
    int x;
};
class B : public A {
  // B is derived from A, which makes
  // B "compatible" to A
public:
  // B adds a 2nd member, which means
  // that B is "bigger" than A
    int y;
};
int main()
{
    B a1[10];
    A *a2;
    a2 = a1; // this is legal :-( 
    a1[0].x=1;
    a1[0].y=1;
    a2[0].x=2;
    a2[1].x=3; // Upps: this probably overwrites a1[0].y
    printf("a1[0].x = %dn",a1[0].x);
    printf("a1[0].y = %dn",a1[0].y);
    return 0;
}

用" g -wall -pedantic -fstrict -aliasing"或您发现的任何其他选项编译。我至少没有设法发出警告。上面的代码不是使用任何类型的铸件,但您仍然会得到破坏或至少肯定不会做您认为应该做的事情的代码。

C 大师现在可能建议使用"向量"或其他任何东西。但这不是重点。重点是C 是不是完全键入安全。

编辑:由于这似乎令人困惑,因此这是对问题的根源的解释。

因为C 是面向对象的" B类",与" A类"兼容(因为" B类"是从" A类"派生的)。因此,这意味着您可以在需要" a类"对象的地方使用" B类"对象。反过来,这意味着您可能在需要" A类 *"指针的地方使用" B *类"指针。

现在问题是C 允许指针算术(因为它是C遗产)。指针算术与继承和兼容类型的相互作用相当严重。因为在上面的示例中," A2 1"(A2是" A类 *"指针)导致地址与" A1 1"不同(A1是" B *类"指针)。

so总结:C DEEMS类型" B *类"类型与type"类a *"兼容,但不幸的是,这些类型是不是当您将其用于指针算术时。