在C ++中,存储有关类型的信息以及如何执行类型安全检查?

时间:2015-08-21 00:22:43

标签: c++ type-safety

类型安全在C ++中是一件大事。不支持隐式转换的不同类型的变量不能设置为相等。 如何进行安全检查? 除了变量本身,还有一些关于为该变量存储的类型的信息吗?

2 个答案:

答案 0 :(得分:4)

变量本身并不包含有关其包含内容的任何信息。相反,C ++使用其编译步骤执行各种验证步骤,以确保在运行时一切正常。

如果我有以下功能,请简单地说:

double convert(int32_t num)
{
    return static_cast<double>(num);
}

它编译成一个过程,该过程采用其唯一参数并执行32位整数到64位浮点转换。如果你给它一个32位的浮点数,它就会做错误的事情。

但是类型系统确保调用convert的任何人提供32位整数(注意编译器可能会在某些情况下代表您插入转换,但该函数只能看到32位整数)因此,不需要运行时检查您提供的内容实际上是32位整数。

类型系统当然在编译时存在,并且会非常仔细地跟踪。请看以下示例:

int32_t x = 12;
double y = convert(x);

编译器视图包括xint32_tconvertint32_t并返回doubley为一个double。由于这些都是排队的,因此无需转换即可成功编译。相反:

char* x = "12";
double y = convert(x);

无法编译,因为char *int32_t不同(且不可转换)。

答案 1 :(得分:1)

C ++被设计为编译的语言。这意味着编译器在编译时执行语言规范所需的任何检查。这种检查所需的一切都由编译器存储在编译器的内部数据结构中。这些数据结构仅在编译期间存在。

将C ++代码成功编译为可执行代码后,即可完成所有检查。什么都不存储了。什么都没有被检查。

换句话说,C ++语言中的类型安全检查是静态

此原则的唯一例外是dynamic_cast的功能,它可以执行某些运行时(动态)类型检查。为此,存储一些运行时类型信息(RTTI)确实是必要的。通过typeid将相同的数据用于运行时类型识别。但这是一个单独的主题,它并没有真正覆盖C ++中的常规类型检查本质上是 static 的事实。