以下示例是 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 的缺陷吗?