prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 1.24

Q我有extern数组定义在一个文件中,并在另一个文件中使用

file1.c:			file2.c:

int array[] = {1, 2, 3};	extern int array[];
为什么不sizeof数组file2.c?


A一个extern大小未指定的数组是一个不完整的类型;你不能对其应用sizeofsizeof在编译时运行,并且它无法了解在另一个文件中定义的数组的大小。

你有三种选择

  1. 声明一个伴随变量,其中包含数组的大小,该变量与数组定义在同一个源文件中定义并初始化(带有sizeof)。
    file1.c:			file2.c:
    
    int array[] = {1, 2, 3};	extern int array[];
    int arraysz = sizeof(array);	extern int arraysz;
    
    (另请参阅问题6.23。)
  2. #define为大小定义一个符号常量,以便在定义和extern声明中一致地使用它
    file1.h:
    
    #define ARRAYSZ 3
    extern int array[ARRAYSZ];
    
    file1.c:			file2.c:
    
    #include "file1.h"		#include "file1.h"
    int array[ARRAYSZ];
    
  3. 在数组的最后一个元素中使用某个哨兵值(通常是0, -1NULL),以便代码可以在没有显式大小指示的情况下确定结束
    file1.c:			file2.c:
    
    int array[] = {1, 2, 3, -1};	extern int array[];
    
(显然,选择将在一定程度上取决于数组是否已初始化;如果已初始化,则选项 2 效果不佳。)

另请参阅问题6.21

参考:H&S 第 7.5.2 节,第 195 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管