以下示例是 C 中有效的完整翻译单元吗?
struct foo;
struct foo *bar(struct foo *j)
{
return &*j;
}
struct foo是一个不完整的类型,但我在 C 标准中找不到明确禁止取消引用不完整类型。特别是,§6.5.3.2 说:
一元运算
&符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。如果操作数是一元运算符的结果,则该运算*符和该&运算符都不会被计算并且结果就像两者都被省略了,除了对运算符的约束仍然适用并且结果不是左值。
结果不是左值的事实并不密切 - 返回值不必如此。对*运算符的约束很简单:
一元 * 运算符的操作数应具有指针类型。
和&运算符是:
一元运算
&符的操作数应该是一个函数指示符、一个[]或一元运算符的结果*,或者是一个左值,它指定一个不是位字段且未使用register存储类说明符声明的对象。
这里两者都满足,所以结果应该等价于 just return j;。
但是,gcc 4.4.5 不编译此代码。相反,它给出了以下错误:
y.c:5: error: dereferencing pointer to incomplete type
这是 gcc 的缺陷吗?