【014 关键字】一文彻底搞懂extern用法

本文详细介绍了C/C++中声明与定义的区别,声明仅告知编译器变量名和类型,不分配内存,而定义则为变量分配内存并可赋值。extern关键字用于外部声明,允许在不同文件间共享函数和变量。在C++中,extern用于调用C编译的函数,解决命名规则差异。文章还提供了实例和注意事项,帮助理解声明、定义和extern的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章已经生成可运行项目,

一、定义和声明的区别

声明:用来告诉编译器变量的名称和类型,而不分配内存,不赋初值

定义:为了给变量分配内存,可以为变量赋初值

注:定义要为变量分配内存空间;而声明不需要为变量分配内存空间。


二、extern用法

extern是一种“外部声明”的关键字,字面意思就是在此处声明某种变量或函数,在外部定义

2.1 extern 函数

为什么要用extern 函数呢?直接#include相应的头文件不可以嘛?

例子,如b.c 想调用a.c 中的fun函数,有两种方法:

方法1:include 头文件,即直接 #include "a.h" 

方法2:  extern 方法 ,extern void fun(...)这句在调用文件中使用,表示引用全局函数fun(),当然,函数默认是全局的。

优点:不inlcude delayms.h就不会引入大量头文件,进而不会引入大量的无关函数。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。 在makefile中需要led.o和delay.o写在一起,否则link的时候找不到delayms而报错。

2.2 extern 变量

如果文件b.c需要引用a.c中变量int v,就可以在b.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。注意,extern int v可以放在a.c中的任何地方,具体作用范围和局部变量相同。

extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”

2.3 在C++文件中调用C方式编译的函数

比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。 

2.4 注意:声明可以多次,定义只能一次。

extern int i; //声明,不是定义
int i; //声明,也是定义

三、通俗讲解

1. 无论是否有extern修饰,赋初值便是定义。如下两种方式是等价的,必为定义!!!

//如果在声明的时候给变量赋值,那么就去掉extern直接定义变量赋值是等价的
extern int a = 10;//尽量不要写这种定义方式
int a = 10;//上述两条语句等价

2.  int a; 是声明?还是定义?

🍍 在函数内部:

int a;// 定义,作为局部变量分配了空间

extern int a;// 声明

🍍 在函数外部与在头文件中:

int a;// 全局变量,声明兼未初始化定义,详见参考文献

extern int a;// 声明


四、参考内容

在源文件(.c)和头文件(.h)中声明和定义的区别——C语言 - 蓝海人 - 博客园

https://bbs.youkuaiyun.com/topics/390343133 

 

本文章已经生成可运行项目
05-31
### 关于 `extern` 关键字用法与含义 在 C 和 C++ 编程语言中,`extern` 是一个关键字,用于声明变量或函数的存在而不定义它们。这意味着当使用 `extern` 时,编译器知道该标识符(变量或函数)是在其他地方定义的,并且会在链接阶段解析其实际定义。 #### 在 C 中的用法 在 C 中,`extern` 通常用于声明全局变量或函数,表明这些实体是在另一个源文件中定义的。例如: ```c // File1.c int global_var = 10; // File2.c extern int global_var; // 声明 global_var 的存在 void print_global() { printf("%d\n", global_var); // 使用 global_var } ``` 这里,`extern` 告诉编译器 `global_var` 是在其他地方定义的全局变量[^3]。 #### 在 C++ 中的用法C++ 中,`extern` 的功能与 C 类似,但可以扩展到更复杂的场景,例如类型修饰符和链接规则。例如: ```cpp // File1.cpp int global_var = 10; // File2.cpp extern int global_var; // 声明 global_var 的存在 void print_global() { std::cout << global_var << std::endl; // 使用 global_var } ``` 此外,在 C++ 中,`extern` 还可以用来指定外部变量的链接方式。例如,`extern "C"` 用于告诉编译器以 C 链接方式处理某些函数或变量,避免 C++ 的名称修饰问题: ```cpp extern "C" { void c_function(); // 声明一个具有 C 链接的函数 } ``` 这在调用 C 库中的函数时特别有用[^4]。 #### 结合引用内容的解释 在提供的引用中,`extern function void add_node();` 表示 `add_node` 函数的声明位于其他地方,具体实现可能在不同的文件中完成。类似地,在引用[2]中,`PySpam_System()` 是一个静态函数,而如果需要在其他文件中访问类似的函数,则可以使用 `extern` 来声明它[^5]。 ### 示例代码 以下是一个完整的例子,展示如何在 C 和 C++ 中使用 `extern`: ```c // File1.c #include <stdio.h> int global_var = 42; void set_global(int value) { global_var = value; } // File2.c #include <stdio.h> extern int global_var; // 声明 global_var extern void set_global(int); // 声明 set_global 函数 void print_global() { printf("Global var: %d\n", global_var); } int main() { print_global(); set_global(100); print_global(); return 0; } ``` ```cpp // File1.cpp #include <iostream> int global_var = 42; void set_global(int value) { global_var = value; } // File2.cpp #include <iostream> extern int global_var; // 声明 global_var extern void set_global(int); // 声明 set_global 函数 void print_global() { std::cout << "Global var: " << global_var << std::endl; } int main() { print_global(); set_global(100); print_global(); return 0; } ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值