C:如何确定外部数组的sizeof(array)/ sizeof(struct)?

时间:2014-04-22 21:00:59

标签: c arrays compiler-errors sizeof

定义该类型的x类型和数组X

x.h:

typedef struct _x {int p, q, r;} x;
extern x X[];

分隔文件以保留巨大的鸣喇叭数组X

x.c:

#include "x.h"
x X[] = {/* lotsa stuff */};

现在我想使用X

main.c中:

#include "x.h"

int main()
{
    int i;

    for (i = 0; i < sizeof(X)/sizeof(x); i++) /* error here */
        invert(X[i]);

    return 0;
}

main.c无法编译;错误是:

error: invalid application of ‘sizeof’ to incomplete type ‘struct x[]’

如果不对其进行硬编码,如何获得X的大小?

5 个答案:

答案 0 :(得分:14)

x.h添加:

extern size_t x_count;

x.c添加:

size_t x_count = sizeof(X)/sizeof(x);

然后在循环中使用变量x_count

除法必须在包含数组初始值设定项的编译单元中完成,因此它知道整个数组的大小。

答案 1 :(得分:3)

如果可以在数组的末尾放置终止指示符,例如:

x X[] = {/* lotsa stuff */, NULL};

可能是数组中元素的数量无关紧要:

#include "x.h"

int main()
   {
   x *ptr = X;

   while(ptr)
      invert(ptr++);

   return 0;
   }

如果需要数组中的元素数量,也可以使用上述方法对元素进行计数。

答案 2 :(得分:3)

这是使用复合文字的解决方案:

.h

中的

typedef struct _x {int p, q, r} x;

#define LOTSA_STUFF        {1, 2, 3}, {4, 5, 7}
#define LOTSA_STUFF_SIZE  sizeof ((x[]) {LOTSA_STUFF})

extern x X[LOTSA_STUFF_SIZE];

并在.c

x X[LOTSA_STUFF_SIZE] = {LOTSA_STUFF};

对于.c中的定义,您甚至可以做得更好并使用静态断言(STATIC_ASSERT的定义是作为读者的练习;):

x X[] = {LOTSA_STUFF};

STATIC_ASSERT(sizeof X != LOTSA_STUFF_SIZE, "oops, sizes are not equal");

答案 3 :(得分:0)

你不能这样做。但是你可以提供一种方法来获得尺寸。

除了

extern x X[];

添加

extern size_t xArraySize;

或者,最好是

extern size_t xArraySize(void);
x.h

中的

x.c中定义。

将您的循环更改为:

for (i = 0; i < xArraySize(); i++)
    invert(X[i]);

答案 4 :(得分:0)

如果只包含x.h,编译器不知道X的实际大小是多少。只是看看x.h,就没有办法猜测。 您必须使用大小声明X:

extern x X[15];