IAR Embedded 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];
^
从技术上讲,没有理由拒绝一个"指向不完整数组的指针#34;类型。毕竟,只有在取消引用这样的变量或执行某些指针算术时才需要结构定义。
我渴望在可能的情况下隐藏结构定义。
C标准对此有何评价?
答案 0 :(得分:7)
代码使用数组声明符,其中元素类型不完整。根据6.7.6.2/1 数组声明符:这是ISO C中的约束违规:
<强>约束强>
除了可选的类型限定符和关键字static之外,
[
和]
可以分隔表达式或*
。如果它们分隔表达式(指定数组的大小),则表达式应具有整数类型。如果表达式是常量表达式,则其值应大于零。元素类型不应是不完整或函数类型。
答案 1 :(得分:6)
以下陈述
typedef struct incomplete (*why_not)[2];
是指向两个struct incomplete
的数组的指针。编译器还不知道struct incomplete
的大小,因为它尚未定义。
然而,以下内容将起作用:
typedef struct incomplete *why_not[2];
即:struct incomplete
的指针数组。编译器确实知道指向不完整类型的指针的大小(即:它只是存储地址所需的大小)。
编辑:
在任何一种情况下,编译器都不需要知道struct incomplete
的大小(只要没有指针算术发生),因为两个声明都只是声明指针。