IAR嵌入式C编译器对此非常满意,我认为这是正确的C代码:
struct incomplete;
typedef struct incomplete (*why_not)[2];
struct incomplete {struct incomplete *known_to_work;} array[2];
why_not ok = &array;
然而,gcc和clang对why_not
的定义无法处理:
incomplete.c:2:29: error: array type has incomplete element type ‘struct incomplete’
typedef struct incomplete (*why_not)[2];
^
从技术上讲,没有理由拒绝“指向不完整数组”的类型定义。毕竟,只有在解除引用这样的变量或执行一些指针算术时才需要结构定义。
我很渴望尽可能隐藏结构定义。
C标准对此有何规定?
struct S; void f(struct S s[]);
,即使void f(struct S *s);
是正确的,而且如果S是完整的话两者等价。 - M.M