Dr *_*Deo 20 c c++ type-safety
我正在读约C++矢量和中提到,memcpy和printf从C函数不是类型安全.文章:http://en.wikipedia.org/wiki/Vector_(C%2B%2B).
问题:简单的英语,什么是类型安全,什么是"类型安全"替代品?
Chr*_*ung 27
类型安全意味着编译器可以检查您是否使用了正确的类型.例如,如果您正在使用printf,则可能会通过编写以下内容而意外崩溃您的程序:
printf("The meaning of life is %s", 42);
因为42是整数,而不是字符串.
csl*_*csl 11
类型安全意味着编译器将帮助检查您是否混合(不兼容)数据类型.
例如,当你调用时memcpy,函数(和编译器)只在内存中看到两个指针,并且很乐意开始复制数据.这意味着您可以混合不兼容的数据类型,如下所示:
SomeClass a;
AnotherClass b;
memcpy((void*)&a, (void*)&b, sizeof(b));
有许多方法可以获得类型安全性.您可以使用模板并围绕mempcy()创建一个包装器,确保两个指针指向相同的数据类型,或者您可以使用其他方式.
由于您已经在使用STL中的向量,因此您已经在使用或多或少类型安全的实现.
类型安全性控制编译器的使用,检查变量是否为正确类型.C在数据类型安全方面非常松散,例如,这实际上是ANSI C标准,它声明类型提升将发生在数据类型中char,这个赋值中的一个例子将解释这一点,
char ch = 32; /* that is a space character accordingly to ASCII */
int n = ch + 3;
注意ch变量如何被"提升"为类型int.这是合法的,但如果这就是你所暗示的,则值得仔细检查.
像C#编译器这样的编译器不会允许这种情况发生,这就是为什么在C中,使用强制转换运算符的原因如下:
int n = (int)3.1415926535f;
除了挑剔之外,这是一个pi值,会发生什么,是值为n3.
以上用于说明类型安全性,并且C在这方面非常松散.
现代语言中的类型安全性更严格,例如Java,C#,以限制变量的用法和含义.PHP是松散打字的一个很好的例子,你可以这样做:
$myvar = 34;
$myvar = $myvar + "foo";
是$myvar一个整数,还是一个浮点或是一个字符串.这里的类型安全性并不十分清楚可能导致错误的意图是什么,以及试图找出正在发生的事情的快乐调试会话.
希望这可以帮助
| 归档时间: | 
 | 
| 查看次数: | 22971 次 | 
| 最近记录: |