Ian*_*non 23 c c++ type-systems
在Coders at Work(p355)一书中,Guy Steele谈到了C++:
我认为向后兼容C的决定是一个致命的缺陷.这只是一系列无法克服的困难.C基本上有一个腐败型系统.它足以帮助你避免一些困难,但它不是密不透风的,你不能指望它
将类型系统描述为"腐败"是什么意思?
你能用C中的一个简单例子来证明吗?
编辑:
引用听起来很有争议,但我并不想成为.我只想了解他的意思.
请举例说明C而不是C++.我也对"基本"部分感兴趣:)
Cas*_*Cow 19
非类型安全C中的明显示例仅仅来自于您可以从void*转换为任何类型而无需显式转换的事实.
struct X
{
int x;
};
struct Y
{
double y;
};
struct X xx;
xx.x = 1;
void * vv = &xx;
struct Y * yy = vv; /* no need to cast explicitly */
printf( "%f", yy->y );
Run Code Online (Sandbox Code Playgroud)
当然printf本身并不完全是类型安全的.
C++并不完全是类型安全的.
struct Base
{
int b;
};
struct Derived : Base
{
int d;
Derived()
{
b = 1;
d = 3;
}
};
Derived derivs[50];
Base * bb = &derivs[0];
std::cout << bb[3].b << std::endl;
Run Code Online (Sandbox Code Playgroud)
将Derived*转换为Base*没有问题但是当你尝试使用Base*作为数组时遇到问题,因为它会使指针算术全部错误,而所有b值都是1,你可能得到3 (因为整数将进入1-3-1-3等)
char buffer[42];
FunctionThatDestroysTheStack(buffer); // By writing 43 chars or more
Run Code Online (Sandbox Code Playgroud)
基本上你可以将任何数据类型转换为任何数据类型
struct SomeStruct {
void* data;
};
struct SomeStruct object;
*( (int*) &object ) = 10;
Run Code Online (Sandbox Code Playgroud)
没有人抓住你。