(1) 引用同一个文件中的变量(忽略这个场景)
#include<stdio.h>
int func(void);
int main(void)
{
func(); //1
extern int num;
printf("%d",num); //2
return 0;
}
int num = 3;
int func()
{
printf("%d\n",num);
}
2、引用另一个文件中的变量
#ifndef __ADD_H
#define __ADD_H
#include <stdio.h>
//声明变量可被其它文件引用
extern int add_count;
//声明函数可被其它文件引用
extern int add(int a, int b);
#endif
3、引用另一个文件中的函数
#ifndef __ADD_H
#define __ADD_H
#include <stdio.h>
//声明变量可被其它文件引用
extern int add_count;
//声明函数可被其它文件引用
extern int add(int a, int b);
#endif
1. extern
的作用
-
声明外部变量或函数:
-
extern
用于告诉编译器,某个变量或函数是在其他文件中定义的,当前文件只是引用它。
-
-
跨文件共享:
-
通过
extern
,可以在多个文件之间共享全局变量和函数。
-
2. extern
的用法
(1)修饰全局变量
-
声明外部变量:
-
在一个文件中定义全局变量,在其他文件中使用
extern
声明该变量。
-
-
示例:
// file1.c int global_var = 10; // 定义全局变量 // file2.c extern int global_var; // 声明外部变量 void print_var() { printf("global_var = %d\n", global_var); // 输出 global_var = 10 }
(2)修饰函数
-
声明外部函数:
-
在一个文件中定义函数,在其他文件中使用
extern
声明该函数。
-
-
示例:
// file1.c void func() { printf("Hello from func!\n"); } // file2.c extern void func(); // 声明外部函数 int main() { func(); // 调用 func return 0; }
3. extern
的注意事项
(1)变量的定义与声明
-
定义:
-
定义变量时会分配内存。
-
例如:
int global_var = 10;
-
-
声明:
-
声明变量时不会分配内存,只是告诉编译器变量在其他地方定义。
-
例如:
extern int global_var;
-
(2)避免重复定义
-
全局变量只能在一个文件中定义,其他文件只能通过
extern
声明。 -
如果多个文件定义了同名全局变量,会导致链接错误。
(3)初始化
-
使用
extern
声明变量时不能初始化。 -
例如:
extern int global_var = 10; // 错误:不能初始化
(4)与 static
的区别
-
static
限制变量或函数的作用域为当前文件。 -
extern
扩展变量或函数的作用域为多个文件。
4. extern
的常见用途
(1)跨文件共享全局变量
-
在大型项目中,多个文件可能需要共享某些全局变量。
-
示例:
// config.h extern int debug_mode; // 声明外部变量 // config.c int debug_mode = 1; // 定义全局变量 // main.c #include "config.h" int main() { if (debug_mode) { printf("Debug mode is on\n"); } return 0; }
(2)跨文件共享函数
-
在模块化设计中,函数可能在一个文件中定义,在其他文件中调用。
-
示例:
// utils.h extern void print_message(const char *msg); // 声明外部函数 // utils.c #include <stdio.h> void print_message(const char *msg) { printf("Message: %s\n", msg); } // main.c #include "utils.h" int main() { print_message("Hello, world!"); return 0; }
5. extern "C"
的作用(C++ 中)
在 C++ 中,extern "C"
用于告诉编译器按照 C 语言的规则编译函数,以便在 C++ 代码中调用 C 语言编写的函数。
(1)用途
-
在 C++ 中调用 C 语言编写的库函数。
-
避免 C++ 的名称修饰(Name Mangling)。
(2)示例
// mylib.h
#ifdef __cplusplus
extern "C"
{
#endif
void my_function(); // 按照 C 语言的规则编译
#ifdef __cplusplus
}
#endif
// mylib.c
#include <stdio.h>
void my_function()
{
printf("Hello from C function!\n");
}
// main.cpp
#include "mylib.h"
int main()
{
my_function(); // 调用 C 函数
return 0;
}
6. 总结
-
extern
用于声明外部变量或函数,实现跨文件共享。 -
全局变量只能在一个文件中定义,其他文件通过
extern
声明。 -
extern "C"
用于在 C++ 中调用 C 语言编写的函数。 -
合理使用
extern
可以提高代码的模块化和可维护性。