【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关键字,可以将程序的不同部分分散到多个源文件中,使代码结构更加清晰、模块化,有助于代码的维护和重用。

相关推荐
Brilliantwxx18 小时前
【C语言】 初入嵌入式C语言复习(基础+进阶面试题)
c语言·开发语言
wuminyu19 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++
rhythm-ring19 小时前
宏定义续行符 \ 的使用与踩坑
c语言·c++
老当益壮梁奶奶20 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法
「QT(C++)开发工程师」20 小时前
C++11 std::unique_ptr — 独占所有权的智能指针
c语言·开发语言·c++·qt
不正经学生21 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试
布莱克6051 天前
队列详解:定义、分类、应用场景及与栈的区别(C/C++ 代码讲解)
c语言·开发语言·c++·队列
CPETW1 天前
USB TO I2C_(Excel)_Scan ---- 1000KHz总线速率测试_A
c语言·开发语言·网络·科技·单片机
Navigator_Z1 天前
LeetCode //C - 1221. Split a String in Balanced Strings
c语言·算法·leetcode
en.en..1 天前
C语言 static函数与头文件封装规范
java·c语言·前端