C语言中的extern关键字
在本文中,我们将了解C中的extern关键字。
这主要在您有多个源文件并且要在这些文件之间共享变量时使用。
让我们看一下如何正确使用extern
来编译所有文件而不会产生冲突。
extern关键字有什么作用?
在介绍extern
之前,我们先来看两种类型的语句:
- 变量声明语句
- 变量定义语句
声明语句是这样的:
int a; char* ch;
您通知编译器这些变量已经存在,因此它不会为它们单独分配内存。
这是关键点。
还有另一个用于定义变量的语句,您可以其中为该特定变量显式分配存储。
要定义变量,我们通常会执行与以下代码段相似的操作。
//Defining a int a = 10; //Defining ch, even if it is NULL char* ch = NULL;
现在,让我们继续前进。
仅当声明全局变量时,才可以使用extern关键字。
让我们澄清一下。
这意味着在定义全局变量时,不能在extern关键字前添加前缀。
//Allowed. Variable declaration extern int a; //Not allowed. extern with variable definition extern int b = 5;
要了解原因,让我们看看" extern"的实际含义。
当您为全局变量声明添加前缀extern
时,这意味着您要告诉编译器该变量实际上是在其他文件中定义的!
这意味着编译器不需要两次分配相同的共享变量,并且在使用多个源文件时不会引起冲突。
在C中使用extern关键字–完整示例
让我们看一个例子来阐明这一点。
假设我们有两个源文件和两个头文件:
file1.c
,file1.h
file2.c``file2.h
。
假设有一个单独的名为main.c的主程序,它是驱动程序。
因此,让我们考虑file1.c
,其中定义了一个名为int file1_var
的全局变量。
因此,我们打算使用extern
将其共享给file2.c
。
我将为file1.h
提供示例代码,该文件具有file1.c
的功能的简单函数原型,以便其他程序在包含头文件file1.h时可以找出要调用的功能。
。
//file1.h //Contains function prototypes for functions of file1.c int addition_1(int a, int b);
//file1.c //Contains function definition for addition_1() #include "file1.h" #include <stdio.h> //Also has a global variable called file1_var //We are defining it here so that it can be shared by other files //when they use extern on this variable int file1_var = 100; int addition_1(int a, int b) { file1_var = file1_var + 100; printf("Inside file1.c addition(). file1_var = %d\n", file1_var); return a + b; }
我已经将file1_var
的初始值设置为100。
类似地,我将对file2.h
和file2.h
执行相同的操作。
但是现在,由于我们要引用file1_var
,因此我们需要使用extern
,仅对其进行声明。
//file2.h int addition_2(int a, int b);
//file2.c //Contains function definition for addition_2() #include "file2.h" #include <stdio.h> //Makes an extern reference to file1_var extern int file1_var; int addition_2(int a, int b) { file1_var = file1_var + 200; printf("Inside file2.c addition(). file1_var = %d\n", file1_var); return a + b; }
现在,这两个文件共享一个变量file1_var
,当调用任何addition()
函数时该变量也会更新。
让我们为驱动程序" main.c"编写代码,该程序调用这两个函数。
因此,我们必须同时包含头文件file1.h
和file2.h
。
#include "file1.h" #include "file2.h" #include <stdio.h> //We can also use the file1_var reference here! extern int file1_var; //We must have only one main() reference //Since this is our driver program, the main function must be only here int main() { int res1 = addition_1(10, 20); int res2 = addition_2(30, 40); printf("file1_var = %d\n", file1_var); return 0; }
我将使用gcc
来编译所有文件:
gcc -o main.out main.c file1.c file2.c
该命令编译并链接文件main.c,file1.c和file2.c,并创建一个名为main.out的可执行文件。
要执行,输入。 /main.out
。
./main.out
输出
Inside file1.c addition(). file1_var = 200 Inside file2.c addition(). file1_var = 400 file1_var = 400
输出确实确实符合我们的期望。
当调用" addition_1()"时," file1_var"将增加100。
现在,再次调用addition_2()
时,它将增加200。
因此,最后,file1_var的更新值为400!
我们已经成功地使用了extern在多个源文件之间共享变量!