什么是类型安全,什么是"类型安全"替代品?

Dr *_*Deo 20 c c++ type-safety

可能的重复:
什么是类型安全的?
什么是类型安全?

我正在读约C++矢量和中提到,memcpyprintf从C函数不是类型安全.文章:http://en.wikipedia.org/wiki/Vector_(C%2B%2B).

问题:简单的英语,什么是类型安全,什么是"类型安全"替代品?

Chr*_*ung 27

类型安全意味着编译器可以检查您是否使用了正确的类型.例如,如果您正在使用printf,则可能会通过编写以下内容而意外崩溃您的程序:

printf("The meaning of life is %s", 42);
Run Code Online (Sandbox Code Playgroud)

因为42是整数,而不是字符串.

  • 正确; C++是一个弱类型系统,因为你可以基本上转换任何其他类型的任何类型,ints to bools和其他所有类型.C++为程序员提供了对机器的完全控制; 记忆就是记忆,而C++会让你放松一下,因为它要求你确切地知道你正在做的每一步都在做什么. (5认同)

csl*_*csl 11

类型安全意味着编译器将帮助检查您是否混合(不兼容)数据类型.

例如,当你调用时memcpy,函数(和编译器)只在内存中看到两个指针,并且很乐意开始复制数据.这意味着您可以混合不兼容的数据类型,如下所示:

SomeClass a;
AnotherClass b;
memcpy((void*)&a, (void*)&b, sizeof(b));
Run Code Online (Sandbox Code Playgroud)

有许多方法可以获得类型安全性.您可以使用模板并围绕mempcy()创建一个包装器,确保两个指针指向相同的数据类型,或者您可以使用其他方式.

由于您已经在使用STL中的向量,因此您已经在使用或多或少类型安全的实现.


t0m*_*13b 8

类型安全性控制编译器的使用,检查变量是否为正确类型.C在数据类型安全方面非常松散,例如,这实际上是ANSI C标准,它声明类型提升将发生在数据类型中char,这个赋值中的一个例子将解释这一点,

char ch = 32; /* that is a space character accordingly to ASCII */
int n = ch + 3;
Run Code Online (Sandbox Code Playgroud)

注意ch变量如何被"提升"为类型int.这是合法的,但如果这就是你所暗示的,则值得仔细检查.

像C#编译器这样的编译器不会允许这种情况发生,这就是为什么在C中,使用强制转换运算符的原因如下:

int n = (int)3.1415926535f;
Run Code Online (Sandbox Code Playgroud)

除了挑剔之外,这是一个pi值,会发生什么,是值为n3.

以上用于说明类型安全性,并且C在这方面非常松散.

现代语言中的类型安全性更严格,例如Java,C#,以限制变量的用法和含义.PHP是松散打字的一个很好的例子,你可以这样做:

$myvar = 34;
$myvar = $myvar + "foo";
Run Code Online (Sandbox Code Playgroud)

$myvar一个整数,还是一个浮点或是一个字符串.这里的类型安全性并不十分清楚可能导致错误的意图是什么,以及试图找出正在发生的事情的快乐调试会话.

希望这可以帮助


Tho*_*mas 7

无论如何,既然你在维基百科上:输入 safety

粗略地说,类型安全意味着该语言禁止您意外地混淆类型。

memcpy不是类型安全的,因为您可以轻松地将某些内存复制intchar数组中并最终得到无意义的数据。printf不是类型安全的,因为您可以提供%i带有字符串的格式说明符;同样,该字符串将被解释为 anint并且最终会得到垃圾。(顺便说一句,VC++编译器在某些情况下确实会检查格式字符串。)

std::vector<T>是类型安全的,因为它只允许您将给定类型的值放入T其中。(当然,您可以进行显式类型转换,但要点是您必须明确执行不类型安全的操作)。