【发布时间】:2017-10-19 08:12:28
【问题描述】:
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];
^
从技术上讲,没有理由拒绝“指向不完整数组的指针”类型的定义。毕竟,只有在取消引用此类变量或执行某些指针运算时才需要结构定义。
我渴望尽可能隐藏结构定义。
C 标准对此有何评论?
【问题讨论】:
-
在任何情况下都不能使用类型“不完整类型的数组”(即使是函数参数)
-
@M.M 其实,为什么不呢?
-
向 IAR 提交错误报告。像这样的废话是我不使用他们的编译器的原因。他们有胃口要求您付钱给他们,以便为他们的不合规错误获得修复。这更令人尴尬,因为 C 的这一部分从 1980 年代就已经存在了。
-
@not-a-user 因为标准是这么说的
-
这也是 C 中的约束违规,原因相同:
struct S; void f(struct S s[]);,即使void f(struct S *s);是正确的,如果 S 是完整的,则等价
标签: c arrays pointers pointer-arithmetic incomplete-type