考虑以下方法:
typedef struct {} empty;
typedef struct { char x; } onechar;
void sink2(void* left, void* right);
void pass2empties() {
empty e1, e2;
sink2(&e1, &e2);
}
void pass2chars() {
onechar e1, e2;
sink2(&e1, &e2);
}
int check2empties() {
empty e1, e2;
return (&e1 == &e2);
}
int check2chars() {
onechar e1, e2;
return (&e1 == &e2);
}
unsigned sizeofempty() {
return sizeof(empty);
}
我注意到 clang
和 icc
在 pass2empties< 中为
。允许这种行为吗?&e1
和 &e2
传递相同的地址
在 clang
的情况下,函数的行为非常奇怪:
int passAndCheck() {
empty e1, e2;
empty *left = &e1, *right = &e2;
sink2(left, right);
return (left == right);
}
它将相同的指针传递给 sink2
,但返回 0 进行直接比较。所以你有这样的情况 left == right
和 left != right
对于相同的 left
和 right
.这是允许的吗?
组装can be seen here .
最佳答案
typedef struct {} empty;
行包含语法错误。 C11 6.7.2.1/1 中struct
声明的语法要求大括号包含struct-declaration-list,这不是可选的。
因此,符合标准的编译器必须发出诊断,并且程序的行为未由标准定义。
关于c - 是否要求指向两个不同本地空对象的指针比较不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662517/