您的位置:

理解extern关键字作用的多个方面

一、变量定义与声明

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中使用。