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

目录

📌 一、C语言中的 extern

1. 基本作用

2. 示例说明

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

在另一个 .c 文件中使用该变量:

编译方式:

3. 函数的 extern

4. 头文件中使用 extern

📌 二、C++ 中的 extern

1. 基本用法与 C 相同

2. extern "C" 的用途

使用场景:

示例:

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

✅ 四、总结


📌 一、C语言中的 extern

1. 基本作用

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

2. 示例说明

定义全局变量(只在一个 .c 文件中):
// main.c
#include <stdio.h>int globalVar = 10;  // 全局变量定义extern void otherFunction();  // 声明外部函数int main() {otherFunction();return 0;
}
在另一个 .c 文件中使用该变量:
// other.c
#include <stdio.h>extern int globalVar;  // 声明为 extern,表示这个变量在别的地方定义void otherFunction() {printf("globalVar = %d\n", globalVar);
}
编译方式:
gcc main.c other.c -o program

3. 函数的 extern

  • 所有函数默认都是 extern 的。
  • 所以你通常不会写 extern void func();,而是直接声明函数原型即可。
// main.c
void otherFunction();  // 默认就是 externint main() {otherFunction();return 0;
}
// other.c
#include <stdio.h>void otherFunction() {printf("Hello from otherFunction!\n");
}

4. 头文件中使用 extern

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

// globals.h
#ifndef GLOBALS_H
#define GLOBALS_Hextern int globalVar;  // 声明为 extern#endif

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

// main.c
#include "globals.h"int globalVar = 10;  // 只在这里定义一次int main() {...return 0;
}
// other.c
#include "globals.h"
#include <stdio.h>void otherFunction() {printf("globalVar = %d\n", globalVar);
}

📌 二、C++ 中的 extern

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

1. 基本用法与 C 相同

// main.cpp
#include <iostream>int globalVar = 10;extern void otherFunction();int main() {otherFunction();return 0;
}
// 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 文件中的函数或变量
示例:
// 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 中的 externC++ 中的 extern
基本用途声明变量/函数在其他文件中定义同左
函数默认属性所有函数默认是 extern同左
头文件使用推荐在头文件中用 extern 声明变量同左
extern "C"❌ 不支持✅ 支持,用于兼容 C
名称修饰(Name Mangling)❌ 无✅ 存在,默认开启,需用 extern "C" 关闭
变量定义限制只能在一个 .c 文件中定义同左(ODR 规则)

✅ 四、总结

  • extern 是 C/C++ 中用于跨文件访问变量或函数的关键字。
  • 在 C 中主要用于多文件共享全局变量。
  • 在 C++ 中除了类似功能外,还引入了 extern "C" 来支持与 C 的互操作。
  • 正确使用 extern 可以避免重复定义错误,并提高模块化设计能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84769.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84769.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84769.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程语言的演化与选择:技术浪潮中的理性决策

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;为什么“选对语言”比“掌握语言”更重要&#xff1f; 在软件开发的世界里&#xff0c;语言是一切的基础。…

【StarRocks系列】StarRocks vs Mysql

目录 StarRocks 简介 核心特性 典型应用场景 StarRocks vs MySQL&#xff1a;核心区别详解 关键差异总结 如何选择&#xff1f; StarRocks 简介 StarRocks 是一款高性能、全场景、分布式、实时分析型的数据库&#xff08;MPP - 大规模并行处理&#xff09;。它诞生于解决…

Axios 知识点全面总结

文章目录 Axios 知识点全面总结一、Axios 基础概念1. 什么是 Axios&#xff1f;2. 核心特性 二、安装与基本用法1. 安装2. 基本请求示例 三、请求方法与参数四、请求配置选项&#xff08;config&#xff09;五、拦截器&#xff08;Interceptors&#xff09;六、错误处理七、取消…

【软考高级系统架构论文】论 SOA 在企业集成架构设计中的应用

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service - Oriented Architecture, SOA)的新型企业应用集成技术,强调将企业和组织内部的资源和业务功能暴露为服务,实…

springboot 提供的可扩展接口

一、spring 和 springboot Spring框架提供了全面的基础架构支持。包含依赖注入和开箱即用等模块&#xff0c;如&#xff1a;Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test Spring Boot 约定大于配置-----消除了设置Spring应用程序所需…

python学习打卡day55

DAY 55 序列预测任务介绍 知识点回顾 序列预测介绍 单步预测多步预测的2种方式 序列数据的处理&#xff1a;滑动窗口多输入多输出任务的思路经典机器学习在序列任务上的劣势&#xff1b;以随机森林为例 作业&#xff1a;手动构造类似的数据集&#xff08;如cosx数据&#xff09…

Leetcode hot100 Java刷题

文章目录 快排146. LRU 缓存acm模式树的前中后序遍历acm模式链表的基本操作1. 两数之和49. 字母异位词分组128. 最长连续序列283. 移动零11. 盛最多水的容器15. 三数之和42. 接雨水53. 最大子数组和56. 合并区间73. 矩阵置零48. 旋转图像141. 环形链表142. 环形链表 II24. 两两…

Linux 命令详解 —— 进程管理

文章目录 精通Linux操作系统(以Centos7为例)进程管理ps常用组合进程状态 STAT 详解高级筛选与格式化输出按条件过滤进程自定义输出字段显示进程树关系排障场景定位高 CPU检查僵尸进程查看进程的线程查看进程打开的文件/网络连接常用组合速查top前5摘要区进程列表信息交互式命令…

【软考高级系统架构论文】论湖仓一体架构及其应用

论文真题&#xff1a; 随着5G、大数据、人工智能、物联网等技术的不断成熟&#xff0c;各行各业的业务场景日益复杂&#xff0c;企业数据呈现出大规模、多样性的特点&#xff0c;特别是非结构化数据呈现出爆发式增长趋势。在这一背景下&#xff0c;企业数据管理不再局限于传统…

Docker 高级管理笔记

前言&#xff1a;Docker 高级管理概述 随着 Docker 技术的广泛应用&#xff0c;容器化已成为现代软件开发与部署的核心方式。本笔记聚焦 Docker 高级管理中的两大关键技术 —— 容器通信与数据持久化&#xff0c;深入解析 Docker 网络模式、端口映射、容器互联机制及数据卷管理…

Spring Boot 项目初始化

一、什么是 CommandLineRunner CommandLineRunner 是 Spring Boot 提供的一个 函数式接口&#xff0c;声明如下&#xff1a; 该接口只有一个 run(String... args) 方法&#xff0c;会在 Spring Boot 容器启动完成后被自动调用。 你可以将它理解为一种“钩子函数”&#xff0c;…

C# winform教程(二)----ComboBox

一、作用 一个可以输入也可以下拉的列表框。 二、属性 一般我们都是使用下拉列表&#xff0c;不使用在线编辑&#xff08;本人没用过&#xff09; 属性 名称内容含义items组合框中项可以定义下拉列表的值DropDownStyle外观和功能是否可以填写&#xff0c;一般选择dropdownli…

FFmpeg裁剪视频在Android上的实现

添加依赖&#xff1a; implementation com.arthenica:mobile-ffmpeg-full:4.4.LTS 代码实现&#xff1a; fun cropMiddleThird(inputPath: String, outputPath: String) {val cmd arrayOf("-y", // 覆盖输出文件"-i", inputPath,"-filter:v&quo…

openEuler 22.03 sp1 更新openssh 10.0p2 —— 筑梦之路

华为欧拉openEuler制作openssh 9.1/9.2/9.3 p1 rpm——筑梦之路_欧拉构建openssh-CSDN博客 上面是需要修改的sshd_config配置&#xff0c;将这3行注释掉。 附上22.03 sp1的yum源文件 # cat openEuler.repo #generic-repos is licensed under the Mulan PSL v2. #You can use t…

AGI(4)大模型的推理综述

本文源自基于基础模型的推理综述《A Survey of Reasoning with Foundation Models》&#xff0c;因为原文有点难于理解&#xff0c;在这个论文的基础上增加了自己的解释和理解&#xff0c;重新整理成此文。大家可以通过查看原文阅读原始论文。 1、推理的概念 推理是解决复杂问题…

Rust 中的宏与函数

在 Rust 编程中&#xff0c;宏&#xff08;Macro&#xff09;和函数&#xff08;Function&#xff09;是两种非常重要的编程工具。虽然它们都可以用来组织代码和实现复用&#xff0c;但它们在定义方式、作用原理、性能、灵活性以及适用场景等方面存在诸多不同。本文将详细介绍 …

c++中左值与右值

在 C++ 中,左值(lvalue) 和 右值(rvalue) 是表达式的基本属性,它们决定了表达式能否被赋值、取地址等操作。 1. 核心定义 左值(lvalue) 特点:表示一个具名的、持久的对象,可位于赋值语句左侧。示例: int x = 42; // x是左值 x = 100; // 合法:左值可…

DeepSeek14-open-webui 常用概念区分

I、“Tools & Functions” 与 Pipelines&#xff08;工作流系统&#xff09;区别 以下是“Tool & Functions”与“Pipelines”的区别、适用场景及作用的详细分析&#xff0c;内容基于参考文档提取与总结&#xff1a; 一、本质区别 维度Tool & FunctionsPipeline…

PaddleOCR + Flask 构建 Web OCR 服务实战

1、前言 随着图像识别技术的发展,OCR(光学字符识别)已经成为很多应用场景中的基础能力。PaddleOCR 是百度开源的一个高性能 OCR 工具库,支持中英文、多语言、轻量级部署等特性。 而 Flask 是一个轻量级的 Python Web 框架,非常适合快速构建 RESTful API 或小型 Web 应用…

C++结构体初始化与成员函数实现语法详解

C结构体初始化与成员函数实现语法详解 一、结构体静态成员初始化语法 在C中&#xff0c;静态成员变量需要在类外部进行定义和初始化。提供的代码展示了如何为MAIN_PROPULSION_CAN类的静态成员变量进行初始化&#xff1a; MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPU…