在C中,我应该被允许使用指向不完整类型数组的指针吗?

时间:2017-05-19 09:11:31

标签: c arrays pointers pointer-arithmetic incomplete-type

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标准对此有何评价?

2 个答案:

答案 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的大小(只要没有指针算术发生),因为两个声明都只是声明指针。