如果我定义一个简单的数组:
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
但如果我移动相同的表格' 2D数组在一个单独的文件中并在上一个主文件中保留上面提到的print语句,但只是添加一个extern,如下所示:
extern int tableint[][2];
我在以下行中收到错误:
printf("Value = %d\n",sizeof(tableint));
as:&size;' sizeof'到不完整的类型' int [] [2]'
我很想知道为什么当2D阵列存在于同一个文件中时它才起作用而不是当我将它移动到另一个文件中时?
如果我将extern定义为:
,错误就会得到解决extern int tableint[5][2];
有什么方法我不需要在这里提到extern中的行数?
答案 0 :(得分:4)
以这种方式声明的数组 - 声明中带有[]
- 当且仅当声明包含初始值设定项时才具有完整类型。如果没有初始化程序,则类型不完整。
这是你在第一种情况下发挥作用的不同之处。
如果你真的需要将其声明为extern
,那么你别无选择,只要你明确指定所有尺寸,只要你需要这种sizeof
技术(或者只要你想要的话)将数组大小视为常量表达式)。
如果您不关心能够使用sizeof
技巧,并且如果您对将数组大小视为运行时值感到满意,那么您可以从中导出它"单独的文件"作为另一个变量或作为函数。
答案 1 :(得分:3)
这是因为C源文件被视为单独的单个翻译单元,而不是彼此独立编译(例如使用gcc -c ...
)。在涉及链接阶段之前,存储在某个单元中的信息不能被另一个单元访问。
话虽如此,规范很清楚,您不能将sizeof
运算符作为不完整类型,因为N1570 6.5.3.4/1 sizeof和_Alignof运算符表示:
sizeof
运算符不应用于具有的表达式 函数类型或不完整类型,括号的名称 一个类型,或指定一个位字段成员的表达式。