C++:重定义:符号重定义:变量重定义(二):解决变量重定义(const static)
C++:重定义:符号重定义:变量重定义_hongwen_yul的博客-CSDN博客
上一篇文章中,我们知道解决变量重复定义其中一个办法是:尽量不要头文件中定义变量,头文件只做变量的声明。但是如果我们一定要在头文件中定义,那应该怎么处理了 ?
1:将变量定义成const
a.h#pragma once
const int A = 2;=====================================================================================b.h / b.cpp 代码保持不变,并且按照正常编译指令编译成 b.o 即:
gcc -c b.cpp -o b.o====================================================================================c.h/c.cpp 代码也保持不变, 按照正常编译指令编译成 c.o 即:
gcc -c c.cpp -o c.o====================================================================================main.cpp 代码保持不变,按照正常编译指令编译成 main.o 即:
gcc -c mian.cpp -o main.o==================================================================================链接: 我们使用指令将 b.o / c.o/ mian.o 三个文件链接起来 即:gcc b.o c.o main.o -o main.exe发现并没有报错,可以正常运行,并可以正常打印出相关数值。
为什么变量用 const 修饰后,就不报错了 ?
- 为全局的 const对象默认没有 extern声明,所以在只在当前文件有效,把这样的对象写在头文件中, 即使它后来被其他多个 .cpp 文件包含进去,那么这个对象也只在包含它的那个文件中有效, 对其他文件来说是不可见的,所以 便不会出现多重定义的情况 。
- 同时,这些 .cpp 文件中的该对象都是从一个头文件中包含进去的,这样也可以保证 这些 .cpp 文件中的这个 const对象的值是相同的,可谓一举两得。
2:将变量定义成static
在 C 语言中,对于被声明为 static 的全局实体(包括变量和函数),在声明它的文件之外是不可见的。这句话来自于C++ Primer一书,如下所示:
- 在C语言编程中,static的一个作用就是信息屏蔽。比方说,你自己定义了一个文件,该文件中有一系列的函数以及变量的声明和定义,你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。
- 所以,在不同文件中定义同名的staitc函数是没问题的,不会冲突的。
- 对于本例中,如果在变量和函数前添加一个static修饰,就不会再提示变量重复定义的问题。因为static限定的变量和函数只在包含头文件的cpp中是可见的,在其他cpp中不可见,所以多个cpp包含这个头文件多次去定义变量和函数,因为相互之间不可见,所以没有出现重复定义的问题。
那既然有了上面的理论依据,我们可以将 a.h 头文件里面的变量 A定义成 static
a.h#pragma once
static int A = 2;=====================================================================================b.h / b.cpp 代码保持不变,并且按照正常编译指令编译成 b.o 即:
gcc -c b.cpp -o b.o====================================================================================c.h/c.cpp 代码也保持不变, 按照正常编译指令编译成 c.o 即:
gcc -c c.cpp -o c.o====================================================================================main.cpp 代码保持不变,按照正常编译指令编译成 main.o 即:
gcc -c mian.cpp -o main.o==================================================================================链接: 我们使用指令将 b.o / c.o/ mian.o 三个文件链接起来 即:gcc b.o c.o main.o -o main.exe发现并没有报错,可以正常运行,并可以正常打印出相关数值。
参考文献
一文带你彻底搞懂C/C++编程中static与extern两关键字的使用_dvlinker的博客-CSDN博客
C++:重定义:符号重定义:变量重定义(二):解决变量重定义(const static)相关推荐
- python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...
前言: 今天为大家带来的内容是:用python解决动态的定义变量名(并给其赋值方法:大数据处理)具有很好的参考价值,希望对大家有所帮助.喜欢本文内容的记得点赞转发收藏不迷路哦!!! 最近消费kafka ...
- go数组详解:数组的定义、遍历、使用细节、二维数组的定义及其遍历
引入 [1]练习引入: package main import "fmt" func main(){//实现的功能:给出五个学生的成绩,求出成绩的总和,平均数://给出五个学生的成 ...
- gmm中隐变量是什么的_互助问答第163期:GMM和二值变量问题
1.老师您好!我所用的数据是动态面板,想用系统GMM和差分GMM进行估计,模型为: Y=a0+a1X1+a2X2+a3X1X2 其中,X1是内生变量,X2为外生变量,X1X2为二者交互项,请问: 由于 ...
- mstem函数怎么定义_小白该怎么学Java开发 Java编程重要点有哪些
小白怎么学Java开发?Java编程重要点有哪些?在Java的学习中,面向对象应该是Java技术的重中之重,虽然在生活中没有对象可以面对,但在技术中还是要一直接触面对对象,而且不可避免.下面小编为大家 ...
- 递归重入c语言延时函数多任务程序设计中的函数重入问题按照Keil的规范对函数添加关键字“reentrant”,将函数定义为可重入的 void Delay_MS(x) reentrant
c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题 weixin_39559333 2020-11-29 09:07:44 39 收藏 文章标签: c语言延时函数 c语言延时函数delay ...
- c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...
C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回 ...
- 在javaScript中,变量名和函数名不能重名
直接上代码和截图 在javaScript中,变量的名字和函数的名字不能取一样的名字(即变量名和函数名不能重名) <script type="text/javascript"& ...
- 模拟链接器 重定位符号表
模拟连接器创建文件头 user_app.asm 的头部模拟各种段选择子填充, 符号表的占位 app_core.asm 用于模拟加载程序 realloc_user_symbol 用来重定位符号表 loa ...
- shell基础(2):编程基础之变量:全局/局部/环境变量(作用域、定义、操作)、位置参数、数组
对shell变量有一个系统性的了解 变量的种类:局部.全局.环境变量 变量的定义和操作:赋值.取值.取消变量 特殊变量:位置参数. $? 数组的定义和使用 变量的作用域 文章目录 1. 变量的种类 1 ...
最新文章
- javaee校园信息服务器,基于javaEE服务器 学生考勤管理系统的设计与实现开题报告...
- java instanceof 原理_java-在现代JVM实现中如何实现instanceof?
- JVM源码—教你傻瓜式编译openjdk7
- 电脑cmd命令大全_查询电脑IP地址
- arc 和 非arc兼容
- qt中实现息屏开平mousepress_QT信号槽分析
- 5904.刺客信条(AC)
- 数数题(计数类 DP)做题记录
- 大型网站技术架构(八)--网站的安全架构(转)
- 感受来自AI的幸福:可可豆、巧克力与人工智能
- mysql java 问题_【Java】连接MySQL问题总结
- hdu4734 F(x)
- 程序员必备智力题集锦 (典藏版)
- 计算机组装与维护过程与方法,计算机组装与维护的实训报告
- CSS动画入门:一分钟实现球体上下跳动动画效果
- java 新浪短链接_新浪t.cn短链接如何生成?网址缩短api接口分享
- 正宇丨有钱,把日子过好;没钱,把心情过好
- 电脑网络被别的计算机控制,电脑被别人远程控制了,怎么办?
- 使用jQuery 快速高效制作 网页特效
- 五大系统OA,PM,KM,ERP,CRM简要说明