C语言中的extern关键字
作用
在C语言中,extern关键字用于声明外部变量或函数。它通常用于在一个源文件中引用另一个源文件中定义的全局变量或函数。
当您在一个源文件中声明一个变量或函数为extern时,它表示该变量或函数的定义存在于另一个源文件中。编译器在编译时会将这个声明标记为外部符号,而不是在当前源文件中分配存储空间。
外部变量必须定义在所有函数之外,且只能定义一次,定义后编译程序将为它分配存储单元。
下面是一个示例,展示了如何使用extern关键字来声明并引用外部变量:
在文件 file1.c 中定义全局变量 count:
代码语言:javascript复制// file1.c
int count = 10;
在文件 file2.c 中使用 extern 声明并引用 count:
代码语言:javascript复制// file2.c
#include <stdio.h>
extern int count; // 声明 count 为外部变量
int main() {
printf("The value of count is: %dn", count); // 引用外部变量 count
return 0;
}
在上述示例中,file2.c 文件使用 extern 声明了 count 变量,以便引用 file1.c 中定义的全局变量 count。这样,编译器在链接时会找到 count 的定义,并将其正确地与 file2.c 中的引用关联起来。
在编译时,您需要同时编译 file1.c 和 file2.c 这两个源文件,并将它们链接在一起以生成可执行文件。例如,使用以下命令编译并链接这两个文件:
代码语言:javascript复制gcc file1.c file2.c -o myprogram
然后,运行生成的可执行文件 myprogram,您将看到输出结果为 The value of count is: 10。
总结而言,extern关键字用于在一个源文件中引用另一个源文件中定义的全局变量或函数。它允许您在一个源文件中声明外部变量或函数,并在另一个源文件中使用这些声明进行引用。
扩展
如果程序包含在多个源文件中,而某个变量在 file1 文件中定义、在 file2和 file3文件中使用,那么在文件 file2与file3 中就需要使用 extern 声明来建立该变量与其定义之间的联系。
人们通常把变量和函数的extern 声明放在一个单独的文件中(习惯上称之为头文件),并在每个源文件的开头使用#include 语句把所要用的头文件包含进来。后缀名.h约定为头文件名的扩展名。
例如,标准库中的函数就是在类似于<stdio.h>的头文件中声明的。
以下是一个示例,展示了如何将外部变量和外部函数的声明放置在头文件中:
在 myheader.h 头文件中声明外部变量和外部函数:
代码语言:javascript复制// myheader.h
#ifndef MYHEADER_H // 防止头文件被重复包含
#define MYHEADER_H
extern int count; // 外部变量的声明
int addNumbers(int a, int b); // 外部函数的声明
#endif
在 file1.c 源文件中定义外部变量和外部函数:
代码语言:javascript复制// file1.c
#include "myheader.h" // 包含头文件
int count = 10; // 外部变量的定义
int addNumbers(int a, int b) { // 外部函数的定义
return a b;
}
在 file2.c 源文件中使用外部变量和外部函数:
代码语言:javascript复制// file2.c
#include <stdio.h>
#include "myheader.h" // 包含头文件
int main() {
printf("The value of count is: %dn", count); // 使用外部变量 count
int result = addNumbers(5, 3); // 调用外部函数 addNumbers
printf("The result is: %dn", result);
return 0;
}
在上述示例中,我们将外部变量 count 和外部函数 addNumbers 的声明放置在 myheader.h 头文件中。然后,在需要使用这些外部变量和函数的源文件中,通过 #include “myheader.h” 将头文件包含进来。
这种做法的好处是,通过使用头文件,我们可以确保在多个源文件中的声明是一致的,避免重复编写相同的声明。同时,头文件提供了对外部变量和函数的说明文档,方便其他开发者了解如何使用这些外部实体。
需要注意的是,头文件中应该只包含声明而不是定义。变量和函数的定义应该放在对应的源文件中。