C语言 在多个源文件之间共享变量问题

C语言中,extern 关键字用于在多个源文件之间共享变量。它的作用是声明一个全局变量或函数,而不是定义它。使用 extern 可以在一个文件中引用另一个文件中定义的变量,而不需要重新定义该变量。

1、extern 的作用

extern 通常用于声明全局变量或函数,声明告诉编译器变量存在但不在当前文件中定义。变量的实际定义(即内存分配)应该在某个源文件中,而其他需要使用该变量的源文件则通过 extern 关键字进行声明。

有两个源文件:file1.cfile2.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;
}

推荐阅读
cjavapy编程之路首页