1、extern 的作用
extern 通常用于声明全局变量或函数,声明告诉编译器变量存在但不在当前文件中定义。变量的实际定义(即内存分配)应该在某个源文件中,而其他需要使用该变量的源文件则通过 extern 关键字进行声明。
有两个源文件:file1.c 和 file2.c。我们希望在 file2.c 中访问 file1.c 中定义的全局变量 counter。
1)在 file1.c 中定义变量
// file1.c
#include <stdio.h>
int counter = 0; // 变量的定义(内存分配)
void increment() {
counter++;
printf("Counter: %d\n", counter);
}
注意:counter 是一个全局变量,定义在 file1.c 中,它的内存分配也在这里完成。
2)在 file2.c 中声明变量
// file2.c
#include <stdio.h>
extern int counter; // 变量的声明
void printCounter() {
printf("Counter from file2.c: %d\n", counter);
}
注意:file2.c 中,使用 extern 声明 counter 变量。告诉编译器 counter 变量已经在其他文件中定义,这里只是引用它。
3)创建 main.c 并链接两个源文件
// main.c
#include <stdio.h>
void increment();
void printCounter();
int main() {
increment(); // 调用 file1.c 中的函数,增加 counter 的值
printCounter(); // 调用 file2.c 中的函数,打印 counter 的值
return 0;
}
2、编译并链接
编译这三个文件时,需要将它们一起编译和链接,
gcc main.c file1.c file2.c -o myprogram
注意:生成一个名为 myprogram 的可执行文件。运行程序时,file1.c 中的 increment() 函数会增加 counter 的值,而 file2.c 中的 printCounter() 函数会读取并打印这个值。
3、extern 的使用示例
extern 关键字用于声明一个全局变量或函数,而不是定义它。它的主要作用是在不同文件之间共享变量或函数,使得可以在一个文件中引用另一个文件中定义的全局变量或函数。创建3个文件,main.c主程序入口,用于引用在 variables.c 中定义的变量。variables.c 包含全局变量的定义和函数实现。variables.h 包含变量和函数的声明。
1)variables.h
variables.h 是头文件,用于声明全局变量 sharedVar 和函数 displaySharedVar,以便其他文件可以引用它们。
// variables.h #ifndef VARIABLES_H #define VARIABLES_H // 使用 extern 声明一个全局变量 extern int sharedVar; // 使用 extern 声明一个函数 extern void displaySharedVar(); #endif // VARIABLES_H
2)variables.c
variables.c 中定义了全局变量 sharedVar 并实现了 displaySharedVar 函数。
// variables.c
#include "variables.h"
#include <stdio.h>
// 定义全局变量
int sharedVar = 42;
// 定义函数
void displaySharedVar() {
printf("The value of sharedVar is: %d\n", sharedVar);
}3)main.c
main.c 中引用了 variables.h,可以直接访问 sharedVar 和调用 displaySharedVar 函数。
// main.c
#include <stdio.h>
#include "variables.h"
int main() {
// 调用 displaySharedVar 函数
displaySharedVar();
// 修改 sharedVar 的值
sharedVar = 100;
// 再次调用 displaySharedVar 函数
displaySharedVar();
return 0;
}