当前位置: 首页 > wzjs >正文

河北建设厅查询网站公司网站制作公司

河北建设厅查询网站,公司网站制作公司,百度网址提交,页游代理🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…

🚀 C++ extern 关键字深度解析:跨文件编程的终极指南
📅 更新时间:2025年6月5日
🏷️ 标签:C++ | extern关键字 | 多文件编程 | 链接与声明 | 现代C++

文章目录

  • 前言
  • 🔥一、extern 是什么?
    • 🎯 关键词解释:
    • 👇声明 VS 定义
      • 声明
      • 定义
      • 总结
  • 🚨 二、如何利用extern解决重定义问题
    • 🚨产生原因
    • 🧠 原理解析:
    • 💡解决办法
  • 📁三、extern 跨文件共享变量
  • ❌四、extern 常见错误分析
    • ❶ 多重定义错误(multiple definition)
    • ❷ undefined reference 错误
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:
在 C++ 的世界里,extern 是一个看似简单却极其重要的关键字。它在跨文件变量访问、函数声明、内外部链接管理中扮演了关键角色。初学者容易忽视它的重要性,甚至误用它导致编译错误链接错误如 undefined reference。

本文将从以下几个方面,带你深入理解 extern 的本质与用法:


提示:以下是本篇文章正文内容,下面案例可供参考

🔥一、extern 是什么?

简单地说,extern 用于声明一个变量或函数在其他文件中定义。它告诉编译器:“这个标识符不是在当前文件中定义的,去别的地方找吧”

🎯 关键词解释:

extern int count;  // 声明一个整型变量 count 在其他地方定义

它并不分配内存,而只是“声明”变量存在于别处,由链接器去解析实际定义

👇声明 VS 定义

在深入extern之前,必须明确 声明(Declaration)和定义(Definition) 的区别:

声明

声明(Declaration):告诉编译器某个变量/函数的存在,但不分配内存

extern int global_var;  // 声明,不分配内存
void foo();            // 函数声明

函数声明前面默认是有extern的 所以可以省略

定义

定义(Definition):为变量/函数分配存储空间,并给出具体实现

int global_var = 42;   // 定义,分配内存
void foo() { ... }     // 函数定义

extern仅用于声明,不能用于定义!

总结

在这里插入图片描述注意:extern int a = 10; 实际上也是定义,容易误导新手!
所以基本上不会这样写

🚨 二、如何利用extern解决重定义问题

🚨产生原因

我们说过头文件只能用来做文件的声明源文件用来做文件的实现
如果我们在头文件中定义变量会怎么样呢?

假设我们在global.h中定义了两个变量

//global.h
int global_age = 10;//这是定义 不是声明
std::string global_name = "llfc";//这是定义 不是声明

然后我们创建global.cpp包含global.h

//global.cpp
#include "global.h"

然后我们在main.cpp中包含global.h

//main.cpp
#include <iostream>
#include "global.h"
int main() {std::cout << "Hello, World!" << std::endl;std::cout << "globbal name is" << global_name << std::endl;std::cout << "global age is " << global_age << std::endl;return 0;
}

我们运行上述代码, 程序编译并未产生问题,但是链接产生问题

[1/3] Building CXX object CMakeFiles/day05_extern.dir/global.cpp.obj
[2/3] Building CXX object CMakeFiles/day05_extern.dir/main.cpp.obj
[3/3] Linking CXX executable day05_extern.exe
FAILED: day05_extern.exe 
multiple definition of `global_age'; CMakeFiles/day05_extern.dir/main.cpp.obj: /global.h:8: first defined here
multiple definition of `global_name[abi:cxx11]'; CMakeFiles/day05_extern.dir/main.cpp.obj:/global.h:9: first defined here

上述报错的意思是在链接main.cpp.obj时发现global_age重定义,第一次定义在global.h这里
同样链接mian.cpp.obj时发现global_name重定义,第一次定义在global.h

因为global.h中定义了global_age,根据我们之前学习的预编译知识,只要是包含global.h的文件都会展开global.h,main.cpp展开了一次,global.cpp展开了一次

🧠 原理解析:

🚨 问题的本质在于:变量定义只能出现一次
头文件中定义变量(错误示例)

// global.h
int global_age = 20;  // ❌ 定义:分配了存储空间
// main.cpp
#include "global.h"
// another.cpp
#include "global.h"

🔴 错误原因:

global.h 被两个 .cpp 文件包含。

每个 .cpp 文件都复制了一份 int global_age = 20;。

链接阶段报错:变量多重定义(LNK2005 / LNK1169)

💡解决办法

可以采用extern关键字声明变量,然后将变量的定义放在global.cpp中, 这样main.cpp包含global.h就只会展开声明。声明可以重复声明,不会有问题

global.h中用extern声明两个变量

//global.h
extern int global_age ;
extern std::string global_name ;

global.cpp定义这些变量

//global.cpp
#include "global.h"
#include <string>
// 定义全局变量
std::string global_name = "John Doe";
int global_age = 30;

main.cpp中包含global.h

//main.cpp
#include <iostream>
#include "global.h"
int main() {std::cout << "Hello, World!" << std::endl;std::cout << "globbal name is" << global_name << std::endl;std::cout << "global age is " << global_age << std::endl;return 0;
}

再次编译,运行成功

Hello, World!
globbal name isJohn Doe
global age is 30

📁三、extern 跨文件共享变量

假设我们有两个 .cpp 文件:main.cpputils.cpp,我们希望在 utils.cpp 中定义一个全局变量 count,并在 main.cpp 中使用它

📁 utils.cpp

#include <iostream>
int count = 10;  // 实际定义

📁 main.cpp

#include <iostream>extern int count;  // 声明,而非定义int main() {std::cout << "Count is: " << count << std::endl;return 0;
}

这样就不会报错,main.cpp中的这个extern就会告诉编译器,这个count已经在其他地方定义了,你自己去找就好了

❌四、extern 常见错误分析

❶ 多重定义错误(multiple definition)

// file1.cpp
int count = 10;// file2.cpp
int count = 20;  // ❌ error: multiple definition of 'count'

✅ 解决方式:
只在一个 .cpp 文件中定义变量,在其他文件用 extern 声明

❷ undefined reference 错误

// main.cpp
extern int num;int main() {return num;  // ❌ error: undefined reference to `num`
}

这个错误表示你声明了变量,但链接阶段找不到定义。

✅ 解决方式:
确保有一个源文件里有 int num = 0; 的定义

总结

在这里插入图片描述
extern 是你理解多文件组织、链接过程、变量生命周期的桥梁。不掌握它,你永远会被 undefined reference 等链接错误困扰。

如果你觉得本文对你有帮助,不妨点赞 + 收藏 + 关注,更多 C++ 系列教程将持续更新 🔥!

http://www.dtcms.com/wzjs/50426.html

相关文章:

  • 深圳做营销网站公司百度站长平台注册
  • 用点心做点心官方网站深圳创新创业大赛
  • 自媒体运营小程序开发网站建设域名注册流程
  • 外贸淘宝网站建设微信公众号推广方法有哪些
  • 如何创建一个国外免费网站线上宣传有哪些好的方式方法
  • 江西建设监督网新网站网站页面优化内容包括哪些
  • 钓鱼网站下载安装灰色广告投放平台
  • 国内疫苗接种率广州宣布5条优化措施
  • 学仿网站seo上首页排名
  • 网站建设制作人员招聘要求百度搜索收录
  • 合肥新站开发区管委会网站企业网站设计与实现论文
  • 网站名称是什么意思兰州网站seo服务
  • 网站网页设计中怎么添加页码信息seo每日一帖
  • 全球疫情实时播报百度关键词优化策略
  • 现在pc网站的标准一般是做多大软文推广代表平台
  • 优秀网站建设报价seo排名软件怎么做
  • 长沙做网站 必看 磐石网络seo自然排名
  • 建设通网站首页百度下载app下载安装到手机
  • o2o网站建设方案宣传推广图片
  • css做网站宽高怎么决定网站优化推广外包
  • wordpress移动自媒体seo关键词优化费用
  • 深州市政府网站河北深州新民居建设网络营销的特点有哪些?
  • 北京建行网站百度官方优化指南
  • 提高网站公信力 单仁做网站哪个公司最好
  • 胡先煦回复秦海璐网页链接seo培训学什么
  • 凡客陈年现状关键词首页排名优化价格
  • 做网站租什么服务器app推广工作靠谱吗
  • 怎么做百度搜到的网站免费的重庆电子商务网站seo
  • 广州网站开发人关键词采集网站
  • 随州网站建设全包优化大师好用吗