一、变量定义与声明
extern一般用于变量或函数的声明,主要的作用是告诉编译器这个变量或函数已经在别的地方定义了,在此处只需要声明即可。具体用法为:
/*在main.c文件中*/ int a = 10; /*在其他文件中,声明使用*/ extern int a;
这样其他文件就可以使用变量a了。
需要注意的是,如果要使用extern关键字,变量或函数必须先在其他文件中定义过了。
二、跨文件的变量共享
在C语言中,跨文件的变量共享是比较常见的需求。当多个文件需要使用同一个变量时,我们可以在一个文件中定义该变量,并使用extern声明该变量,然后在其他文件中用extern关键字再次声明该变量,从而实现变量共享。
看下面的示例:
/*在var.c文件中*/ int global_var; /*在other.c文件中*/ extern int global_var; /*在main.c文件中*/ int main(void) { global_var = 10; /*在main.c中给global_var赋初值*/ other_func(); /*在main.c中调用函数*/ } void other_func(void) { printf("%d", global_var); /*在other.c中使用global_var的值*/ }
在这个示例中,我们在var.c中定义了一个全局变量global_var,然后在other.c中用extern关键字声明该变量,以便在other_func函数中使用。在main.c中定义了该变量,然后调用other_func函数,最后输出全局变量global_var的值。
三、常量定义与声明
使用extern关键字还可以在一个文件中定义常量并在其他文件中使用。这种方式非常适合用来定义程序中经常需要用到的一些常量。
看下面的示例:
/*在const.c文件中*/ extern const int MAX_SIZE = 100; /*在main.c文件中*/ int main(void) { printf("%d", MAX_SIZE); /*使用const.c中定义的常量*/ }
在这个示例中,我们在const.c文件中定义了一个常量MAX_SIZE,并用extern关键字声明该常量,以便在main.c中使用。在main.c中使用了该常量。
四、跨平台共享变量
有时候我们需要在不同平台的代码之间进行数据共享。此时,为了确保数据类型和字节对齐方式的一致性,我们需要使用特殊的编译指令来约束变量的内存分配方式,以免数据类型和字节对齐方式不同,导致数据共享失败。
具体做法是在定义变量时,使用__declspec(dllexport)或__declspec(dllimport)声明变量的内存分配方式。这些指令可以告诉编译器如何分配变量的内存,以及在不同平台上如何对齐变量。
看下面的示例:
/*在common.h文件中*/ #ifdef _WIN32 #define COMMON_API __declspec(dllexport) #else #define COMMON_API extern #endif /*在common.c文件中*/ int COMMON_API global_var; /*在other.c文件中*/ extern int global_var;
在这个示例中,我们在common.h文件中定义了一个宏COMMON_API,在Windows平台上,这个宏声明了变量的内存分配方式为__declspec(dllexport),而在其他平台上,这个宏则声明了变量的内存分配方式为extern。
在common.c文件中,我们定义了一个变量global_var,并使用COMMON_API宏声明变量在不同平台上的内存分配方式。在other.c中,我们使用extern关键字声明该变量,以便在other.c中使用。