extern关键字:C/C++跨文件编程利器

在 C 和 C++ 中,extern 是一个关键字,用于声明变量或函数是在其他文件中定义的。它主要用于实现多个源文件之间的符号共享。

目录

[📌 一、C语言中的 extern](#📌 一、C语言中的 extern)

[1. 基本作用](#1. 基本作用)

[2. 示例说明](#2. 示例说明)

[定义全局变量(只在一个 .c 文件中):](#定义全局变量(只在一个 .c 文件中):)

[在另一个 .c 文件中使用该变量:](#在另一个 .c 文件中使用该变量:)

编译方式:

[3. 函数的 extern](#3. 函数的 extern)

[4. 头文件中使用 extern](#4. 头文件中使用 extern)

[📌 二、C++ 中的 extern](#📌 二、C++ 中的 extern)

[1. 基本用法与 C 相同](#1. 基本用法与 C 相同)

[2. extern "C" 的用途](#2. extern "C" 的用途)

使用场景:

示例:

[📊 三、C vs C++ 中 extern 的对比](#📊 三、C vs C++ 中 extern 的对比)

[✅ 四、总结](#✅ 四、总结)


📌 一、C语言中的 extern

1. 基本作用

  • 告诉编译器该变量或函数已经在别处定义,当前只是引用。
  • 避免重复定义错误,同时允许链接器找到实际的定义位置。

2. 示例说明

定义全局变量(只在一个 .c 文件中):
cpp 复制代码
// main.c
#include <stdio.h>

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

extern void otherFunction();  // 声明外部函数

int main() {
    otherFunction();
    return 0;
}
在另一个 .c 文件中使用该变量:
cpp 复制代码
// other.c
#include <stdio.h>

extern int globalVar;  // 声明为 extern,表示这个变量在别的地方定义

void otherFunction() {
    printf("globalVar = %d\n", globalVar);
}
编译方式:
bash 复制代码
gcc main.c other.c -o program

3. 函数的 extern

  • 所有函数默认都是 extern 的。
  • 所以你通常不会写 extern void func();,而是直接声明函数原型即可。
cpp 复制代码
// main.c
void otherFunction();  // 默认就是 extern

int main() {
    otherFunction();
    return 0;
}
cpp 复制代码
// other.c
#include <stdio.h>

void otherFunction() {
    printf("Hello from otherFunction!\n");
}

4. 头文件中使用 extern

为了方便管理多个 .c 文件中的变量引用,可以将 extern 声明放在头文件中:

cpp 复制代码
// globals.h
#ifndef GLOBALS_H
#define GLOBALS_H

extern int globalVar;  // 声明为 extern

#endif

然后在各个 .c 文件中包含这个头文件:

cpp 复制代码
// main.c
#include "globals.h"

int globalVar = 10;  // 只在这里定义一次

int main() {
    ...
    return 0;
}
cpp 复制代码
// other.c
#include "globals.h"
#include <stdio.h>

void otherFunction() {
    printf("globalVar = %d\n", globalVar);
}

📌 二、C++ 中的 extern

C++ 中的 extern 与 C 类似,但有一些扩展和差异。

1. 基本用法与 C 相同

cpp 复制代码
// main.cpp
#include <iostream>

int globalVar = 10;

extern void otherFunction();

int main() {
    otherFunction();
    return 0;
}
cpp 复制代码
// other.cpp
#include <iostream>

extern int globalVar;

void otherFunction() {
    std::cout << "globalVar = " << globalVar << std::endl;
}

2. extern "C" 的用途

这是 C++ 独有的功能,用于关闭 C++ 的名字改编(name mangling)机制,以便调用 C 编写的函数或变量。

使用场景:
  • 调用 C 库函数
  • 混合编程:C++ 调用 C 编写的 .c 文件中的函数或变量
示例:
cpp 复制代码
// C 函数声明
extern "C" {
    void c_function();
    int c_variable;
}

int main() {
    c_function();
    std::cout << "c_variable = " << c_variable << std::endl;
    return 0;
}

这告诉编译器:这部分符号按照 C 的方式来处理,不要进行 C++ 的重载解析或名称修饰。


📊 三、C vs C++ 中 extern 的对比

特性 C 中的 extern C++ 中的 extern
基本用途 声明变量/函数在其他文件中定义 同左
函数默认属性 所有函数默认是 extern 同左
头文件使用 推荐在头文件中用 extern 声明变量 同左
extern "C" ❌ 不支持 ✅ 支持,用于兼容 C
名称修饰(Name Mangling) ❌ 无 ✅ 存在,默认开启,需用 extern "C" 关闭
变量定义限制 只能在一个 .c 文件中定义 同左(ODR 规则)

✅ 四、总结

  • extern 是 C/C++ 中用于跨文件访问变量或函数的关键字。
  • 在 C 中主要用于多文件共享全局变量。
  • 在 C++ 中除了类似功能外,还引入了 extern "C" 来支持与 C 的互操作。
  • 正确使用 extern 可以避免重复定义错误,并提高模块化设计能力。
相关推荐
weixin_499771554 分钟前
C++中的组合模式
开发语言·c++·算法
初级代码游戏5 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
_waylau8 分钟前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙
2的n次方_19 分钟前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
近津薪荼35 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck37 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
_F_y42 分钟前
C++重点知识总结
java·jvm·c++
java干货1 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y1 小时前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
毕设源码-郭学长1 小时前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析