该变量或函数的定义在其他地方。这是实现模块化和代码组织的重要手段。以下表格总结了 extern 关键字的主要用途。

用途

描述

示例

变量声明

告诉编译器变量在其他文件中定义,不分配内存。

extern int global_var;

变量定义

实际分配内存并初始化变量。

int global_var = 10;

函数声明

告诉编译器函数在其他文件中定义,提供函数的签名。

extern void my_function(int);

函数定义

实现函数的具体功能。

void my_function(int x) { ... }

1.1 变量声明与定义
  • 声明extern 声明一个变量或函数,告诉编译器该变量或函数在其他文件中定义。例如: extern int global_var; // 声明 global_var 变量 这表明 global_var 变量在其他地方定义,但在当前文件中可以使用它。
  • 定义:定义一个变量或函数分配实际的内存空间。例如: int global_var = 10; // 定义 global_var 变量并初始化 这实际创建了 global_var 变量,并分配内存。
1.2 函数声明与定义
  • 声明:函数的声明也可以使用 extern 关键字,尽管在C语言中函数默认是 extern 的。例如: extern void my_function(int); // 声明 my_function 函数 这表明 my_function 函数在其他文件中定义,并接受一个整数参数。
  • 定义:函数的定义则包含实际的函数实现。例如: void my_function(int x) { // 函数实现 } 这实际实现了 my_function 函数的功能。

2. extern 的实际应用

2.1 跨文件共享全局变量

假设我们有两个文件:file1.cfile2.c,并希望在这两个文件之间共享一个全局变量。

  • file1.c:

代码语言:c

AI代码解释

  // 定义全局变量
  int global_var = 10;

  void print_global_var() {
      printf("Global variable: %d\n", global_var);
  }
  • file2.c:

代码语言:c

AI代码解释

  #include <stdio.h>

  // 声明全局变量
  extern int global_var;

  void update_global_var(int new_value) {
      global_var = new_value;
  }
  • main.c:

代码语言:c

AI代码解释

  #include <stdio.h>

  // 函数声明
  void print_global_var();
  void update_global_var(int);

  int main() {
      print_global_var();         // 输出: Global variable: 10
      update_global_var(20);
      print_global_var();         // 输出: Global variable: 20
      return 0;
  }

编译和链接

要编译这些文件并进行链接,可以使用以下命令(假设使用 gcc 编译器):

代码语言:c

AI代码解释

gcc file1.c file2.c main.c -o my_program

执行 my_program 后,输出结果如下:

代码语言:c

AI代码解释

Global variable: 10
Global variable: 20
2.2 跨文件共享函数声明

类似于全局变量,函数也可以通过 extern 关键字在文件之间共享。

  • file1.c:

代码语言:c

AI代码解释

  #include <stdio.h>

  void print_message() {
      printf("Hello from file1.c\n");
  }
  • file2.c:

代码语言:c

AI代码解释

  #include <stdio.h>

  extern void print_message(); // 声明函数

  void call_print_message() {
      print_message(); // 调用函数
  }
  • main.c:

代码语言:c

AI代码解释

  #include <stdio.h>

  extern void call_print_message(); // 声明函数

  int main() {
      call_print_message(); // 输出: Hello from file1.c
      return 0;
  }

编译和链接

代码语言:c

AI代码解释

gcc file1.c file2.c main.c -o my_program

执行 my_program 后,输出结果如下:

代码语言:c

AI代码解释

Hello from file1.c

3. 注意事项

  • 初始化与定义extern 关键字不用于初始化变量。初始化变量时应使用非 extern 声明。
  • 同名变量:在多个文件中使用 extern 声明同一个变量时,必须确保变量在一个地方定义,避免链接时的重定义错误。
  • 函数声明:函数的声明可以省略 extern,因为函数声明默认是 extern 的。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐