C++中的static和extern关键字

1 声明和定义

声明就是告诉编译器有这个东西的存在,而定义则是这个东西的实现。

对于变量来说,声明就是告诉编译器存在这个名称的变量,定义则是给这个变量分配内存并赋值:

// 变量声明,声明时不能赋值,如果进行赋值,就是定义
extern int var;// 变量定义,定义时可以为其赋值,并且此时赋值是个好的习惯
int var = 0;

对于函数来说,声明就是告诉编译器存在这个名称的函数,定义则是这个函数的实现。

函数的声明就是给出函数的返回值、函数名和参数类型:

// 函数声明
int add(int a, int b);// 函数定义
int add(int a, int b) {return a + b;
}

声明和定义的区分主要用于全局变量,毕竟,局部变量不需要区分声明和定义。需要记住的是:全局范围内,变量的声明可以有多个,而定义只能有一个。

2 static

被static修饰的全局变量称为静态全局变量,静态全局变量的作用域是当前文件,也就是说,不能使用extern关键字将该变量导入到其他文件访问。

如下示例:

// module.h
#ifndef LUO
#define LUOstatic int var;#endif// module.cpp
#include <iostream>
#include "module.h"void func() {var = 2;printf("var=%d address=%p\n", var, &var);
}// main.cpp
#include <iostream>
#include "module.h"extern void func();int main() {func();printf("var=%d address=%p\n", var, &var);
}

将全局变量放到头文件中,然后在两个文件中使用,执行时可以发现,两个变量的地址不一样,也就是说,虽然这个变量在两个文件中,但是他们其实是不同的变量。

总之,对于static的全局变量,需要记住:它们只能用在当前文件,尽量不要放在头文件中(因为头文件大概率是要被多个源文件引用的)。

static不仅可以修饰全局变量,还可以修饰局部变量,当修饰局部变量时,就修改了变量的声明周期,它就不是存储在栈上,而是存储在全局数据区。

#include <iostream>void func() {static int a = 0;++a;printf("%d\n", a);
}int main() {func();func();
}

这里将func()函数中的变量a用static修饰,执行时会发现,当下一次再次执行时a就是上次执行的值。这样的变量通常可以用于只在某个函数中使用全局变量,也就是要求它的声明周期是全局的,但是使用范围却是某个函数中。

对于函数而言,用static修饰,表明该函数只在当前文件中使用。

3 extern

前面已经说过,extern通常用来声明变量和函数,表明变量在其他地方定义,此处只是告诉编译器有这个东西而已。

因此,extern比较常用的方式就是在头文件中声明变量和函数:

// module.h
#ifndef LUO
#define LUOextern int var;
extern void func();#endif// module.cpp
#include <iostream>
#include "module.h"int var = 0;void func() {var = 2;printf("var=%d address=%p\n", var, &var);
}// main.cpp
#include <iostream>
#include "module.h"int main() {func();printf("var=%d address=%p\n", var, &var);
}

在头文件module.h中声明变量和函数,然后在module.cpp中定义变量和函数,最后在main.cpp中引入头文件,就可以在main.cpp中使用变量和函数了。这种方式就是extern的常规用法。

当然,对于这里的例子,还可以直接将extern的变量和函数放到main.cpp中,由链接器在链接阶段去查找:

#include <iostream>extern void func();
extern int var;int main() {func();printf("var=%d address=%p\n", var, &var);
}

extern的另一个用法就是链接C语言库。

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

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

相关文章

万字总结网络原理

目录 一、网络基础 1.1认识IP地址 1.2子网掩码 1.3认识MAC地址 1.4一跳一跳的网络数据传输 1.5总结IP地址和MAC地址 二、网络设备及相关技术 2.1集线器:转发所有端口 2.2交换机:MAC地址转换表+转发对应端口 2.3主机:网络分层从上到下封装 2.4主机&路由器:ARP…

(三)正点原子STM32MP135移植——optee移植

一、概述 OP-TEE 是一个开源工程&#xff0c;完整的实现了一个可信执行环境。 主要包括 Secure world OS&#xff08;optee_os&#xff09;、normal world client&#xff08;optee_client&#xff09;、test suite&#xff08;optee_test/xtest&#xff09;以及 Linux 驱动部分…

软件项目和安全项目案例(承接软件和安全项目合作)

公司有专业的软件开发团队和安全研究团队&#xff0c;具备完善的安全测试、安全培训、安全开发、安全服务等安全解决方案&#xff0c;可以助力政企研发专业、高效、安全、稳定的软件产品&#xff0c;欢迎项目咨询、商务合作&#xff01; 一、软件开发项目咨询 1.承接车载等终…

Iphone文件传到电脑用什么软件,看这里

在数字化时代&#xff0c;文件传输已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;苹果用户在将手机文件传输到电脑时&#xff0c;往往会面临一些困扰。曾经的“文件传输助手”并不能完全满足用户的需求。于是&#xff0c;很多人开始寻找更便捷的解决方案。在本文中…

【CMU15-445 Part-15】Query Planning Optimization II

Part15-Query Planning & Optimization II Selection Statistics 维护每张表中的基本主要信息也就是tuple数量 N R N_R NR​以及每个属性中不同值的数量 V ( A , R ) V(A,R) V(A,R)&#xff0c; N R N_R NR​关系R中的元组数量&#xff0c;单独维护&#xff0c;不能用pag…

Python 无废话-基础知识函数详解

函数定义 函数是一段可重复使用的代码块&#xff0c;用于实现特定的功能。 类似的前面已学过print(),len(),input(),str(),list(),tuple()等内置函数 自定义函数 内置函数是python类库的已定义好的函数&#xff0c;如果某些功能不能满足时&#xff0c;需要我们自定义函数&am…

《TCP/IP网络编程》代码实现

文章目录 1. 项目说明1.1 项目特点2. 文件说明2.1 脚本文件2.1.1 `TCP_IP.sln`2.1.2 `xmake.lua`2.1.2.1 编译说明2.1.2.2 运行说明2.1.3 章节说明项目代码已经开源在github上! 微信公众号文章同步发表! 1. 项目说明 根据《TCP/IP网络编程》书籍学习,对其中的代码进行整理,…

alsa pcm接口之在unix环境的传输方法

在unix环境,数据片段响应被接受通过standard I/O call或事件等待路径(poll或select功能),为完成列表,异步通知响应该被列举出来.ALSA实现那些方法被描述在ALSA transfers部分. 标准I/O传输(Standadrd I/O transfers) 这个标准I/O传输常常使用read和write C语言函数集,对于那些函…

网页版”高德地图“如何设置默认城市?

问题&#xff1a; 每次打开网页版高德地图时默认定位的都是“北京”&#xff0c;想设置起始点为目前本人所在城市&#xff0c;烦恼的是高德地图默认的初始位置是北京。 解决&#xff1a; 目前网页版高德地图暂不支持设置起始点&#xff0c;打开默认都是北京&#xff0c;只能将…

华为OD机试真题-补种未成活胡杨(Java/C++/Go/Python)

华为OD机试真题-补种未成活胡杨(Java/C++/Go/Python) 题目描述 近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。 一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树? 输入…

假期题目整合

1. 下载解压题目查看即可 典型的猪圈密码只需要照着输入字符解开即可得到答案 2. 冷门类型的密码题型&#xff0c;需要特意去找相应的解题思路&#xff0c;直接百度搜索天干地支解密即可 3. 一眼能出思路他已经给了篱笆墙的提示提示你是栅栏密码对应解密即可 4. 最简单的社会主…

SLAM面试笔记(8) — 计算机视觉面试题

目录 问题1&#xff1a;目标检测的算法分类 问题2&#xff1a;卷积神经网络的组成 问题3&#xff1a;输入层的作用 问题4&#xff1a;卷积层作用 问题5&#xff1a;卷积核类型 问题6&#xff1a;11卷积核作用 问题7&#xff1a;卷积核是否越大越好 问题8&#xff1a;棋…

纯css实现3D鼠标跟随倾斜

老规矩先上图 为什么今天会想起来整这个呢?这是因为和我朋友吵架, 就是关于这个效果的,就是这个 卡片懸停毛玻璃效果, 我朋友认为纯css也能写, 我则坦言他就是在放狗屁,这种跟随鼠标的3D效果要怎么可能能用纯css写, 然后吵着吵着发现,欸,好像真能用css写哦,我以前还写过这种…

大华城市安防系统平台任意文件下载漏洞

一、漏洞描述 大华城市安防监控系统平台是一款集视频、报警、存储、管理于一体的综合安防解决方案。该平台支持多种接入方式&#xff0c;包括网络视频、模拟视频、数字视频、IP电话、对讲机等。此外&#xff0c;该平台还支持多种报警方式&#xff0c;包括移动侦测、区域入侵、…

7 航空公司客户价值分析

第7章 航空公司客户价值分析 7.1 了解航空公司现状与客户价值分析7.1.1 了解航空公司现状7.1.2 认识客户价值分析7.1.3 熟悉航空客户价值分析的步骤与流程 7.2 预处理航空客户数据7.2.1 处理数据缺失值与异常值7.2.2 构建航空客户价值分析的关键特征1. RFM模型介绍2. RFM模型结…

PyTorch入门之【AlexNet】

参考文献&#xff1a;https://www.bilibili.com/video/BV1DP411C7Bw/?spm_id_from333.999.0.0&vd_source98d31d5c9db8c0021988f2c2c25a9620 AlexNet 是一个经典的卷积神经网络模型&#xff0c;用于图像分类任务。 目录 大纲dataloadermodeltraintest 大纲 各个文件的作用&…

认识Oracle

当你想要深入了解 Oracle 数据库时&#xff0c;你进入了一个激动人心的领域。Oracle 是全球最大的关系型数据库管理系统 (RDBMS) 提供商之一&#xff0c;它在企业级数据库领域拥有着强大的地位。本文将带你探索 Oracle 数据库的重要性、特点和一些基本概念&#xff0c;以帮助你…

通过ElementUi在Vue搭建的项目中实现CRUD

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

java.text.ParseException: Unparseable date: “2023-09-06T09:08:18“

问题描述&#xff1a; java.text.ParseException: Unparseable date: “2023-09-06T09:08:18” 这是在String类型转Date类型出现的错误,主要是String类型时间中间有一个T在转换的过程出现问题. 解决方法&#xff1a; SimpleDateFormat simpleDateFormat new SimpleDateFormat…

摄影后期图像编辑软件Lightroom Classic 2023 mac中文特点介绍

Lightroom Classic 2023 mac是一款图像处理软件&#xff0c;是数字摄影后期制作的重要工具之一&#xff0c;lrc2023 mac适合数字摄影后期制作、摄影师、设计师等专业人士使用。 Lightroom Classic 2023 mac软件特点 高效的图像管理&#xff1a;Lightroom Classic提供了强大的图…