【C语言】extern 关键字

在C语言中,extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中,通常用于声明全局变量或函数,这些变量或函数的定义位于其他文件中。

基本用法

  1. 变量声明
c 复制代码
// file1.c
int shared_variable = 10; // 定义变量

// file2.c
extern int shared_variable; // 声明变量

int main() {
    printf("%d\n", shared_variable); // 使用变量
    return 0;
}

在这个例子中,shared_variablefile1.c中定义,并在file2.c中使用extern进行声明,从而可以在file2.c中访问shared_variable

  1. 函数声明
c 复制代码
// file1.c
void shared_function() {
    printf("This is a shared function.\n");
}

// file2.c
extern void shared_function(); // 声明函数

int main() {
    shared_function(); // 调用函数
    return 0;
}

在这个例子中,shared_functionfile1.c中定义,并在file2.c中使用extern进行声明,从而可以在file2.c中调用shared_function

多文件编程

使用extern关键字时,通常会将变量和函数的声明放在头文件(.h文件)中,然后在需要使用这些变量或函数的源文件(.c文件)中包含相应的头文件。

头文件:shared.h

c 复制代码
#ifndef SHARED_H
#define SHARED_H

extern int shared_variable;
extern void shared_function();

#endif // SHARED_H

源文件:file1.c

c 复制代码
#include "shared.h"

int shared_variable = 10;

void shared_function() {
    printf("This is a shared function.\n");
}

源文件:file2.c

c 复制代码
#include <stdio.h>
#include "shared.h"

int main() {
    printf("Shared variable: %d\n", shared_variable);
    shared_function();
    return 0;
}

在这个示例中,shared.h头文件包含变量和函数的声明。file1.c中定义了这些变量和函数,而file2.c通过包含shared.h头文件来访问和使用它们。

注意事项

  • 多次定义问题 :虽然extern关键字允许在多个文件中声明同一个变量或函数,但它们只能在一个文件中定义。如果在多个文件中定义同一个变量或函数,会导致链接错误。

  • 链接阶段处理extern关键字的工作机制在于链接阶段,而不是编译阶段。编译器在编译每个源文件时不会检查extern变量或函数是否已经定义,而是由链接器在链接阶段进行检查。

  • 作用域与存储类extern关键字通常用于全局变量和函数,而不用于局部变量。它的作用域是整个程序,而不仅限于某个文件或函数。

通过使用extern关键字,可以将程序的不同部分分散到多个源文件中,使代码结构更加清晰、模块化,有助于代码的维护和重用。

相关推荐
小徐不徐说38 分钟前
数据结构基础之队列:数组/链表
c语言·数据结构·算法·链表·面试
l1t3 小时前
美团龙猫利用expat库实现的保存xml指定范围数据到csv的C程序
xml·c语言·解析器·expat
xxy.c6 小时前
嵌入式解谜日志—多路I/O复用
linux·运维·c语言·开发语言·前端
坠金6 小时前
CentOS安装或升级protoc
linux·c语言·开发语言
智者知已应修善业7 小时前
【51单片机8*8点阵显示箭头动画详细注释】2022-12-1
c语言·经验分享·笔记·嵌入式硬件·51单片机
极客小张10 小时前
【项目思路】基于STM32+ZigBee的智能家居--浴室场景设计
c语言·python·stm32·智能家居·课程设计·项目设计·企业项目
仰泳之鹅13 小时前
【C语言】深入理解指针(5)
c语言·开发语言
无为之士14 小时前
君正交叉编译链工具mips-gcc540-glibc222-64bit-r3.3.0.smaller.bz2编译st-device-sdk-c
c语言·开发语言
古译汉书18 小时前
嵌入式铁头山羊stm32-SAR型ADC模块介绍、采样时间、转换时间-Day24
c语言·stm32·单片机·嵌入式硬件·iot
我不是板神20 小时前
秋招|MCU+RTOS技术栈——面试八股文整理3:STM32
c语言