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一书,如下所示:

  1. 在C语言编程中,static的一个作用就是信息屏蔽。比方说,你自己定义了一个文件,该文件中有一系列的函数以及变量的声明和定义,你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。
  2. 所以,在不同文件中定义同名的staitc函数是没问题的,不会冲突的。
  3. 对于本例中,如果在变量和函数前添加一个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)相关推荐

  1. python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...

    前言: 今天为大家带来的内容是:用python解决动态的定义变量名(并给其赋值方法:大数据处理)具有很好的参考价值,希望对大家有所帮助.喜欢本文内容的记得点赞转发收藏不迷路哦!!! 最近消费kafka ...

  2. go数组详解:数组的定义、遍历、使用细节、二维数组的定义及其遍历

    引入 [1]练习引入: package main import "fmt" func main(){//实现的功能:给出五个学生的成绩,求出成绩的总和,平均数://给出五个学生的成 ...

  3. gmm中隐变量是什么的_互助问答第163期:GMM和二值变量问题

    1.老师您好!我所用的数据是动态面板,想用系统GMM和差分GMM进行估计,模型为: Y=a0+a1X1+a2X2+a3X1X2 其中,X1是内生变量,X2为外生变量,X1X2为二者交互项,请问: 由于 ...

  4. mstem函数怎么定义_小白该怎么学Java开发 Java编程重要点有哪些

    小白怎么学Java开发?Java编程重要点有哪些?在Java的学习中,面向对象应该是Java技术的重中之重,虽然在生活中没有对象可以面对,但在技术中还是要一直接触面对对象,而且不可避免.下面小编为大家 ...

  5. 递归重入c语言延时函数多任务程序设计中的函数重入问题按照Keil的规范对函数添加关键字“reentrant”,将函数定义为可重入的 void Delay_MS(x) reentrant

    c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题 weixin_39559333 2020-11-29 09:07:44  39  收藏 文章标签: c语言延时函数 c语言延时函数delay ...

  6. c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回 ...

  7. 在javaScript中,变量名和函数名不能重名

    直接上代码和截图 在javaScript中,变量的名字和函数的名字不能取一样的名字(即变量名和函数名不能重名) <script type="text/javascript"& ...

  8. 模拟链接器 重定位符号表

    模拟连接器创建文件头 user_app.asm 的头部模拟各种段选择子填充, 符号表的占位 app_core.asm 用于模拟加载程序 realloc_user_symbol 用来重定位符号表 loa ...

  9. shell基础(2):编程基础之变量:全局/局部/环境变量(作用域、定义、操作)、位置参数、数组

    对shell变量有一个系统性的了解 变量的种类:局部.全局.环境变量 变量的定义和操作:赋值.取值.取消变量 特殊变量:位置参数. $? 数组的定义和使用 变量的作用域 文章目录 1. 变量的种类 1 ...

最新文章

  1. javaee校园信息服务器,基于javaEE服务器 学生考勤管理系统的设计与实现开题报告...
  2. java instanceof 原理_java-在现代JVM实现中如何实现instanceof?
  3. JVM源码—教你傻瓜式编译openjdk7
  4. 电脑cmd命令大全_查询电脑IP地址
  5. arc 和 非arc兼容
  6. qt中实现息屏开平mousepress_QT信号槽分析
  7. 5904.刺客信条(AC)
  8. 数数题(计数类 DP)做题记录
  9. 大型网站技术架构(八)--网站的安全架构(转)
  10. 感受来自AI的幸福:可可豆、巧克力与人工智能
  11. mysql java 问题_【Java】连接MySQL问题总结
  12. hdu4734 F(x)
  13. 程序员必备智力题集锦 (典藏版)
  14. 计算机组装与维护过程与方法,计算机组装与维护的实训报告
  15. CSS动画入门:一分钟实现球体上下跳动动画效果
  16. java 新浪短链接_新浪t.cn短链接如何生成?网址缩短api接口分享
  17. 正宇丨有钱,把日子过好;没钱,把心情过好
  18. 电脑网络被别的计算机控制,电脑被别人远程控制了,怎么办?
  19. 使用jQuery 快速高效制作 网页特效
  20. 五大系统OA,PM,KM,ERP,CRM简要说明

热门文章

  1. java 线程与线程池详解
  2. 阿里云建站之模板建站的核心优势有哪些?
  3. 34day 新浪微博(首页)
  4. HotStuff共识算法详解
  5. 【Qt5 for VS】关于出现 Qt platform plugin windows 运行错误的解决方案
  6. 软件众包网站有哪些?
  7. USB组合设备——带鼠标功能的键盘
  8. 利用Django框架简单设计一个登陆页面
  9. Shell脚本中dirname命令的使用
  10. VScode全大写快捷键_iPad OS 键盘鼠标深度体验,最全快捷键整理。