2010-06-18 53 views
21

我有一个文件,并在另一个我不得不使用它定义了一个数组,对EG-数组的外部延迟?

/* a.c - defines an array */ 

int a[] = {1,2,3,4,5,6,7,8,9}; 


/* b.c - declare and use it. */ 

#define COUNT ((sizeof a)/(sizeof int)) 
extern int a[]; //size of array 

. 
. 
. 

int i; 
for(i=0; i<COUNT; i++) 
    printf("%d", a[i]); 
. 
. 
. 

现在,当我尝试编译它,它给我的错误,说的sizeof水湿不完整的使用类型。

有人可以告诉我如何在C/C++中处理这种情况?我不想数组下标在交流转换器提前

+0

今天我遇到了这个问题。我认为如果链接器可以解析外部对象的引用,那么它也可以解析它们的大小......但是看起来链接器并不那么聪明...... – Calmarius 2013-12-18 19:40:48

回答

20

感谢你可能把类似下面进入a.c,然后从b.c它的extern。

在交流转换器:

int a[] = {1, 2, 3}; 
const int lengthofa = sizeof(a)/sizeof(a[0]); 

然后在b.c:

extern int a[]; 
// the extern (thanks Tim Post) declaration means the actual storage is in another 
// module and fixed up at link time. The const (thanks Jens Gustedt) prevents it 
// from being modified at runtime (and thus rendering it incorrect). 
extern const int lengthofa; 

void somefunc() { 
    int i; 
    for (i = 0; i < lengthofa; i++) 
    printf("%d\n", a[i]); 
} 
0

编译器在编译时b.c确定数组的大小没有足够的信息。该信息仅在a.c中的初始化程序列表在范围内。

您必须以某种方式沟通大小。一种方法是用大小和外部参数来定义一个int常量。另一种可能性是使用标记(有效数据范围外的值)来指示数组的结束。

0

在我看来,如果你没有定义并且在一个文件中用sizeof定义它不能编译。

文件被编译并存储为* .obj/* .a文件。你可以使用来自其他文件的数组感谢extern声明,这将在编译后在链接过程中检查。

你想声明define(preprocesor必须在这里帮忙,它在编译之前运行)。

所以在编译之前,你不会从另一个文件获得阵列...

8

如果你希望你的数组的大小是恒定的访问作为一个编译时间,那么你就没有别的选择,只能指定数组大小明确在extern声明数组

extern int a[9]; 

在这种情况下它成为你的责任,以确保数组大小是extern声明和定义保持一致。您可以为此使用清单常量,但仍然有责任确保{}与声明大小之间的初始值设定项数目相同。

如果你不关心将数组大小作为编译时常量,那么你可以做Mark Wilkins在他的答案中提出的建议。

0

我会#define ARRAY_MAX (or whatever)在通常用于定义这种事情的外部头,然后将这个头包含在两个需要它的文件中。当您倾向于将大部分(如果不是全部)define保留在一个或两个中央标题中时,这种方法效果很好。