extern

extern核心作用:声明但不定义 一个变量或函数。主要用于处理跨文件的变量和函数访问。

变量:

1.声明外部变量:告诉编译器"这个变量在别的文件中定义,我这里只是使用它"

2.不分配内存extern 声明不会分配存储空间

3.不能初始化

函数:

显式声明函数具有外部链接性(但通常可省略,因为函数默认就是 extern

其他功能:
1.在函数内部访问外部变量,只在当前函数中可以访问
_1.函数内部声明的调用成功
_2.未在.c中全局声明,也未在函数内部声明:失败

2.覆盖局部变量,访问全局变量

C++ 中的特殊用法

1.extern "C" 的主要作用就是:告诉 C++ 编译器,按照 C 语言的规则来编译和链接被它修饰的代码

C++ 的名称修饰: C++ 支持函数重载、命名空间、类等特性。编译器为了在链接时能区分这些同名但参数不同的函数,会对函数名进行"修饰"或"改编"。例如,函数 void foo(int) 可能会被编译器改编成 _Z3fooi 这样的符号。

C 的名称修饰: C 语言没有函数重载等特性,所以它的名称修饰规则非常简单直接。通常只是在函数名前加一个下划线,如 foo 变成 _foo

2.extern 模板(C++11)作用:显式模板实例化声明

先了解普通模板工作原理:

1.隐式实例化: 当你在代码中使用一个模板时(例如 std::vector<int>),编译器会在**当前编译单元(.cpp)**中自动生成该模板的代码。这个过程发生在编译期。
2.问题所在: 如果你的项目有多个 .cpp 文件都使用了 std::vector<int>,那么每个文件在编译时都会独立生成一份 std::vector<int> 的代码。这会导致:
_1.编译时间变长: 每个编译单元都要重复进行相同的实例化工作。
_2.代码膨胀: 目标文件中有多份相同的代码。
_3.链接器负担: 链接器需要消除这些重复的代码,只保留一份。
为了解决这个问题,引入了这个extern 模板
1. 显式模板实例化声明
2. 显式模板实例化定义
3. 在用户代码中使用
相关推荐
超梦dasgg6 分钟前
Java 生产环境 MQ 技术选型全解析
java·开发语言·java-rocketmq·java-rabbitmq
霸道流氓气质6 分钟前
Spring AI 多工具链式调用(Tool Chain)极简实战
java·人工智能·spring
罗超驿41 分钟前
22.深入剖析JDBC架构:从原生API到企业级数据交互核心
java·数据库·mysql·面试
桀人43 分钟前
C++——模板初阶(收录在专栏C++入门到精通)
开发语言·c++
一直有一个ac的梦想1 小时前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
九皇叔叔1 小时前
Spring-Ai-Alibaba [04] 04-llm-platform-custom-demo
java·人工智能·spring
技术路上的探险家1 小时前
Sa-Token 单点登录(SSO)三种模式大白话详解:告别重复登录
java·sa-token·单点登录·sso
JAVA社区1 小时前
Java进阶全套教程(四)—— SpringMVC框架详解
java·开发语言·spring·面试·职场和发展
ㄣ知冷煖★1 小时前
统一网关架构实践:从 Token 鉴权到路由、策略与凭证池转发全链路解析
java·服务器·架构
Lumbrologist1 小时前
【C++】零基础入门 · 第 2 节:变量、基本数据类型与输入输出
java·开发语言·c++