extern在C中声明二维数组?

问题描述:

如果我定义了一个简单的数组:extern在C中声明二维数组?

int tableint[][2] = { 
     {1, 2}, 
     {2, 4}, 
     {3, 9}, 
     {4, 16}, 
     {5, 25} 
}; 

和代码在同样的文件:

printf("Value = %d\n",sizeof(tableint)); 
printf("Value = %d\n",sizeof(tableint[0])); 
printf("Num of rows = %d\n",sizeof(tableint)/sizeof(tableint[0])); 

输出为预期:

Value = 40 
Value = 8 
Num of rows = 5 

但是,如果我移动相同在一个单独的文件“tableint” 2D阵列和保持上述打印语句在先前的主文件,但只是增加一个外部如下:

extern int tableint[][2]; 

我在下面的行得到一个错误:

printf("Value = %d\n",sizeof(tableint)); 

为:的 '的sizeof' 不完全型 'INT [] [2]'

我好奇无效的应用程序要知道为什么当二维数组在同一个文件中时,它的工作原理,而不是当我将它移动到另一个文件时?

而且,如果我定义的extern的错误得到解决:

extern int tableint[5][2]; 

有什么办法,我并不需要提及的行数在这里的extern?

以这种方式声明的阵列 - 在声明[] - 将有当且仅当声明包含一个初始化完整的类型。没有初始化器,类型不完整。

这就是你的区别,使得它在第一种情况下工作。

如果您确实需要将其声明为extern,那么您只有明确指定所有大小,只要您需要此技术即可工作(或者只要您想将数组大小看作是常量表达式)。

如果您不在乎能否使用该技巧,并且如果您对将数组大小视为运行时值感到满意,则可以将该数组作为另一个变量从该“单独文件”中导出或作为功能。

+0

还有其他选项,例如'extern tableint [] [2];'加上一些函数获得的长度为 –

+0

@ M.M .:是的,如果OP不介意失去把尺寸看作*常量表达式*的能力。 – AnT

+0

非常感谢! –

这是因为C源文件作为单独的,个别翻译单元处理,比可被编译独立于彼此(例如用gcc -c ...)。在关联阶段之前,存储在某个单元中的信息对另一个单元是不可访问的。

随着中说,该规范是明确的,你不能拿sizeof运营商不完全类型,如N1570 6.5.3.4/1 sizeof运算和_Alignof运营商说:

sizeof经营者不得被施加到具有 函数类型或不完整的类型的表达式,这种 的括号名称的类型,或者,指定的位字段构件的表达式。

+0

非常感谢! –