我最近惊讶地发现C和C语言标准有一个“严格别名”规则.实质上,该规则禁止不同类型的变量引用相同的内存位置.
举个例子:
char buffer[4] = { 0x55,0x66,0x77,0x88 }; int32 *p = (int32*)&buffer[0]; // illegal because buffer[0] and *p are different types
我与之交互的大多数专业C开发人员都不熟悉此规则.根据我的研究,它似乎主要影响GCC / G / CLANG用户. Visual C是否支持启用/禁用此规则?如果是这样,一个人怎么做?
谢谢
解决方法
“严格别名”是限制程序而不是编译器的C规则.由于违反规则是Undefined Behavior,因此无需任何诊断,编译器无需以任何方式支持它.
也就是说,微软在应用优化方面不那么积极.仅在上周他们就宣布了他们的新优化器assumes no signed overflow,这是GCC已经假设几年的事情.严格的别名会破坏一些Windows标题,因此需要先修复它们. (有几种类型的行为就好像它们包含了工会,但它们并没有正式定义)