定义该类型的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
的大小?
答案 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];