请考虑以下代码:
typedef struct {
int type;
} object_t;
typedef struct {
object_t object;
int age;
} person_t;
int age(object_t *object) {
if (object->type == PERSON) {
return ((person_t *)object)->age;
} else {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
这是合法代码还是违反了C99严格别名规则?请解释为何合法/非法.
考虑以下代码示例:
#include <stdio.h>
typedef struct A A;
struct A {
int x;
int y;
};
typedef struct B B;
struct B {
int x;
int y;
int z;
};
int main()
{
B b = {1,2,3};
A *ap = (A*)&b;
*ap = (A){100,200}; //a clear http://port70.net/~nsz/c/c11/n1570.html#6.5p7 violation
ap->x = 10; ap->y = 20; //lvalues of types int and int at the right addrresses, ergo correct ?
printf("%d %d %d\n", b.x, b.y, b.z);
}
Run Code Online (Sandbox Code Playgroud)
我曾经认为像将B*转换为A*并使用A*来操纵B*对象这样的事情是严格的别名违规.但后来我意识到标准真的只需要:
对象的存储值只能由具有以下类型之一的左值表达式访问:1)与对象的有效类型兼容的类型,(...)
和表达式ap->x如果有正确的类型和地址,ap那里的类型应该不重要(或者它是什么?).在我看来,这意味着只要子结构不作为一个整体被操纵,这种类型的重叠继承就是正确的. …