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

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

XH:

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

单独的文件保持巨大的鸣喇叭数组X

XC:

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

现在我想使用X

main.c中:

 #include "xh" 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的大小?

xh添加:

 extern size_t x_count; 

xc添加:

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

然后在循环中使用变量x_count

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

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

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

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

 #include "xh" int main() { x *ptr = X; while(ptr) invert(ptr++); return 0; } 

如果需要数组中的元素数,则上述方法也可用于计算元素。

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

.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"); 

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

 extern x X[15]; 

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

此外

 extern x X[]; 

 extern size_t xArraySize; 

或者,最好是,

 extern size_t xArraySize(void); 

xh

xc定义它。

将你的循环改为:

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