C语言中的extern关键字

时间:2020-02-23 14:32:03  来源:igfitidea点击:

在本文中,我们将了解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.cfile1.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.hfile2.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.hfile2.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在多个源文件之间共享变量!