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
,那么您只有明确指定所有大小,只要您需要此技术即可工作(或者只要您想将数组大小看作是常量表达式)。
如果您不在乎能否使用该技巧,并且如果您对将数组大小视为运行时值感到满意,则可以将该数组作为另一个变量从该“单独文件”中导出或作为功能。
这是因为C源文件作为单独的,个别翻译单元处理,比可被编译独立于彼此(例如用gcc -c ...
)。在关联阶段之前,存储在某个单元中的信息对另一个单元是不可访问的。
随着中说,该规范是明确的,你不能拿sizeof
运营商不完全类型,如N1570 6.5.3.4/1 sizeof运算和_Alignof运营商说:
的
sizeof
经营者不得被施加到具有 函数类型或不完整的类型的表达式,这种 的括号名称的类型,或者,指定的位字段构件的表达式。
非常感谢! –
还有其他选项,例如'extern tableint [] [2];'加上一些函数获得的长度为 –
@ M.M .:是的,如果OP不介意失去把尺寸看作*常量表达式*的能力。 – AnT
非常感谢! –