【发布时间】:2011-10-19 17:19:15
【问题描述】:
以下示例是 C 中有效的完整翻译单元吗?
struct foo;
struct foo *bar(struct foo *j)
{
return &*j;
}
struct foo 是一个不完整类型,但我在 C 标准中找不到明确禁止取消引用不完整类型。特别是,§6.5.3.2 说:
一元
&运算符产生其操作数的地址。如果 操作数的类型为“type”,结果的类型为“pointer to type”。如果 操作数是一元*运算符的结果,也不是 运算符也不是&运算符被评估,结果就像 两者都被省略了,除了对运算符的约束仍然 应用,结果不是左值。
结果不是左值这一事实并不密切 - 返回值不必如此。 * 运算符的约束很简单:
一元*运算符的操作数应为指针类型。
在& 运算符上是:
一元
&运算符的操作数应为函数 指示符,[]或一元*运算符或左值的结果 指定一个不是位域且未声明的对象 使用register存储类说明符。
这里两者都满足,所以结果应该等同于return j;。
但是,gcc 4.4.5 不编译此代码。相反,它给出了以下错误:
y.c:5: error: dereferencing pointer to incomplete type
这是 gcc 的缺陷吗?
【问题讨论】:
-
我认为你是对的。这肯定不会是第一个,也不会是最后一个……
-
从技术上讲,只有 C99 有这个措辞。 C90 没有提到
&和*相互抵消。对于C99,我同意你的分析。但由于 gcc 并未声称完全符合 C99,因此我对这个错误消息并不感到惊讶。
标签: c pointers language-lawyer incomplete-type