头文件中定义和声明的问题

2023-05-16

头文件中定义和声明的问题

1.头文件中不可以放变量的定义!一般头文件中只是放变量的声明,因为头文件要被其他文件包含#include,如果把定义放在头文件的话,就不能避免多次定义变量。C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。

三个例外:1)值在编译时就已知的const变量的定义可放在头文件中,如:const int num=10;
          2)类的定义可放在头文件中。
          3)inline函数。
2.定义和声明是不同的。定义只能出现一次,而声明可以出现多次。
下面的语句是定义,不能放在头文件中:
extern  int ival=10; //虽然ival声明为extern,但是它初始化了,代表这是个定义。
double fica_rate;  //fica_rate虽然没有初始化,但是没有extern。所以仍是定义。
3.在多个C文件的程序中,想在头文件中声明定义几个变量,如果给声明的变量赋值,则提示重复定义,在声明的变量前加extern只对变量进行声明,可是在什么地方给变量赋值呢??
答:加了extern后,就可以在其他任何引用此文件的地方来进行赋值的。比如说,可在主文件中进行赋值。
4.  extern int x; //变量是声明,并未实际分配地址。
    void print(); //函数声明,并未产生实际目标代码
    如:int x; int x=3; void print() { }; //均为定义。
5。 只有全局变量并且没有被static声明的变量才能声明为extern。所以,如果你不想自己源文件中全局变量被其他文件引用,你就可以给变量加上static声明。
    定义也是声明。C++中有个关键字用来声明变量的,即extern。它声明一个变量,而不定义它。
    注意:在C++中,变量有且只能有一次定义,但是可以声明多次。
    举例说明:假设在文件1.cpp中定义了一个全局变量bufsize,文件1.cpp中当然能访问它,如果我想在文件2.cpp中访问这个全局变量,这时候需要在文件2.cpp中声明这个变量。
    //1.cpp
    int  bufsize;
    //2.cpp
    extern int bufsize;
这里说的是非const的全局变量,如果是const的全局变量,如果想被其他文件访问,需要在定义时,加上extern关键字,表示它可被其他文件声明使用的。否则的话,这个变量只能在它被定义的文件里面被访问,其他文件不能访问。
    //1.cpp
    extern const int  bufsize=10;
    //2.cpp
    extern const int bufsize;
    为什么非const变量定义时候没有extern??答:非const变量默认为extern,const变量默认为文件的局部变量。而const变量如果想在其他文件里被访问,必须显示的指定它为extern。

6. C++标准并没有规定头文件中不能定义变量,只不过如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。


7. 例如:在test.c文件中定义变量int global=0;
可以在头文件test.h中声明这个变量为extern int global;

要使用这个变量的其他文件,只要包含test.h就可以了。


8. static全局变量是有文件作用域的。在a.c中用了,在其他文件中就不能使用了。static变量一般放在.cpp或者.c文件中。不放在.h文件中。
9. 在某一个.c文件中定义:int num=0;
   在.h文件中声明:extern int num;
10. #ifndef、、、#define、、、#endif
可以保证在一个文件里只是定义一次。
比如:a.h引用b.h, c.cpp同时引用a.h和b.h。这样,#ifndef、、、#define、、、#endif可以保证c.cpp里的b.h只被引用一次。
注意:要把头文件的内容都放在#ifndef和#endif中。不管头文件会不会被多个文件引用,都要加上这个。
一般的格式:
#ifndef <标识>
#define <标识>
、、、、
、、、、
#endif
<标识>理论上说可以自由命名。但是每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中.也变成下划线。 如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
、、、
#endif
程序示例:
//a.h
#ifndef A
#define A
bool AorB(bool a)
{
   return a;
}
#endif

//b.h

#include "a.h"
bool CorD(bool a)
{
   return AorB(a);
}

//a.cpp

#include "a.h"
#include "b.h"
int main()
{
   bool a=0;
   bool b=AorB(a);
   bool c=CorD(b);
 
   getchar();
   return 0; 
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

头文件中定义和声明的问题 的相关文章

  • MySQL数据库的多种连接方式

    一 MySQl命令行客户端 在Mysql安装完成后 xff0c Mysql命令行会自动配置在计算机上 xff0c 在菜单中找到MySql 8 0 Command Line Client 输入密码即可进入 xff08 密码在安装过程中设定的
  • 如何在120行内实现一个有协程并支持tbus的服务器框架

    目前协程很火 xff0c 于是决定搞一个框架试试 xff0c 下面的代码很短 xff0c 不过麻雀虽小 xff0c 五脏俱全 目前支持tbus xff0c 配上boost asio xff0c 可以很容易的支持tcp udp 异步文件读写等
  • 基于深度学习的含未知复合故障多传感器信号故障诊断

    文章目录 目的网络实验结果存在的问题 CNN LSTM FCM 目的 1 未知复合故障诊断 2 复合故障解耦 网络 折叠层 xff1a 将输入的序列构建成测量数据帧 序列展开层 扁平化层 xff1a 恢复序列结构 输出矢量序列 卷积 xff
  • STM32 UART串口环形缓冲区的实现思路和代码

    同名微信公众号 固件工人 同步发布的文章 xff0c 欢迎同时关注 xff0c 及时获取最新文章 1 1 环形缓冲区的实现思路 单片机程序开发一般都会用到UART串口通信 xff0c 通过通信来实现上位机和单片机程序的数据交互 通信中为了实
  • 直流电机的简单详细的pid控制

    对于PID的基本原理在这里就不概述了 xff0c 想必大家找PID控制资料更多的是代码的实现 xff0c 而不是理论概述 如果真的不懂理论 xff0c 大家可以在CSDN上面搜索 废话不多说 xff0c 上代码 PID公式 xff1a 根据
  • 卡尔曼滤波-实战IMU姿态估计

    实战 IMU 卡尔曼滤波 基础知识已经准备的差不多了 xff0c 本章开始通过一个实际应用来真正感受一下卡尔曼滤波的魅力 xff01 IMU 滤波 陀螺仪 加速度计 加速度计传感器得到的是 3 轴的重力分量 xff0c 是基于重力的传感器
  • 卡尔曼滤波-EKF

    EKF EKF称为扩展卡尔曼滤波 xff0c 他和标准卡尔曼滤波有何区别呢 xff1f 他的出现主要是为了解决在非线性系统下的最优估计问题 xff0c 前面我们提到标准卡尔曼滤波只适用于线性系统 xff0c 对于非线性系统我们可以用EKF来
  • 解决wordpress安装主题或插件需要FTP问题

    如果该方法不行 xff0c 可参考另外一篇博文 xff1a http blog csdn net qq 32846595 article details 54766833 很多人在使用WordPress安装主题或插件时都要求填写FTP账号和
  • cortex M3 系统svc 系统调用

    STM32 SVCall 一个特殊的中断 xff1a SVCall 简述 xff1a 一种由程序进行触发的中断 xff0c 默认开启 起源 xff1a SVC xff08 系统服务调用 xff0c 亦简称系统调用 xff09 多用于在操作系
  • MIPI lcd屏幕调试方法总结

    以前工作都比较忙 xff0c 很少写总结性的东西了 xff0c 现在有空就写写吧 mipi 时钟比较高 xff0c 一般的小公司示波器是没法测试到波形的 xff0c 此时必须注意步骤 xff0c 否则会因为某些小细节而搞好几天甚至更久 1
  • linux 遇到的内核异常问题分析解决汇总

    nbsp nbsp nbsp 这些年曾经遇到过一些比较棘手的linux 异常问题 遗憾的是很多时候没有及时更新总结 导致我自己再次遇到的时候也要靠网络搜索相关文章去回忆解决办法 本文会持续更新 逐步完善linux 崩溃异常解决问题办法 nb
  • 记录调试Android 休眠唤醒过程中遇到的问题以及解决办法

    nbsp 最近在调试休眠唤醒 遇到不少问题 现在记录下解决问题问题的过程 1 休眠或者唤醒过程中内核异常 nbsp nbsp nbsp 具体解决办法 请看这篇linux 遇到的内核异常问题分析解决汇总 2 休眠过程中唤醒 nbsp nbsp
  • CSDN手机APP终于可以写博客了

    随着年龄增长 xff0c 博客是更新的越来越慢了 xff0c 在公司没时间 xff0c 现在在路上时间挺多 xff0c 当时想着APP能写博客就好了 xff0c 记得开始事不可以的 xff0c 如今这时代 xff0c 回到家开电脑逛论坛的时
  • 中国嵌入式高端ARM开发板的江湖故事——详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局

    Topic xff1a 中国嵌入式高端ARM开发板的江湖故事 详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局 作者 xff1a gooogleman 版权 xff1a gooogleman 邮箱 gooogleman
  • 分析各家2440开发板的性价比(初学者如何选择开发板)

    分析各家2440开发板的性价比 xff08 初学者如何选择开发板 xff09 作者 xff1a gooogleman 邮箱 xff1a gooogleman 64 foxmail com 地址 xff1a http blog csdn ne
  • 一个机械专业小混混(gooogleman)学习嵌入式ARM的真实经历

    我记得在我毕业一周年的时候 xff0c 写过一篇文章 xff0c 大概是讲我学习嵌入式wince驱动的经历 xff08 http topic csdn net u 20090704 01 43492b64 f7bf 4953 a31f db
  • 是时候想想再上一个台阶的时候了

    刚才 xff0c 被一个蚊子吵醒 xff0c 脑子里就想着一件事 xff1a 我这些年也是过的够淡定的了 xff0c 不管旁边发生任何事情 xff0c 我也不去做什么得失比较 xff0c 我乐于享受目前的现状 xff0c 一台还算稳定的国产
  • 关于wince6.0 升级全年包的注意事项(作者:gooogleman)

    作者 xff1a gooogleman Email xff1a gooogleman 64 foxmail com 最近在S5pv210 wince6 0 系统定制上更新了几个包 xff0c 发现了一些微软更新补丁包的问题 xff0c 现在
  • 二级域名绑定二级目录的两种方法

    当用WordPress建站后 xff0c WordPress位于二级目录 xff08 v ar www html xff09 下 xff0c 进行域名解析时如何把域名解析到二级目录下 xff0c 网络上一般有两种方法 xff0c 一是利用接
  • PMP 真的没用吗?

    最近在备考2018 3 24 的pmp 认证考试 xff0c 有不少收获 xff0c 此前我曾在群里邀请大家一起备考 xff0c 一些人跳出来就说考这些有啥用 xff1f 干技术的把技术干好就行了 xff0c 技术人员最烦这些没点技术的项目

随机推荐

  • 一个嵌入式产品的从研发到量产的流程(作者:gooogleman@foxmail.com)

    作者 xff1a gooogleman 64 foxmail com 一个嵌入式产品的开发流程是 1 了解清楚客户需求 2 模具开发 3 硬件工程师准备硬件 xff0c 物料选型 xff0c 原理图 xff0c PCB和模具工程师商议PCB
  • 【电赛国赛备赛笔记】【赛题经验分享会】

    存在的问题 光流问题 起飞后定不住飞行过程中方向太偏光照度对飞行稳定性的影响纹理变化对飞行稳定性的影响 目前还没有很好的解决办法 xff0c 但如果不限制使用器材的话 xff0c 用双目摄像头可能可以解决问题 赛题准备 视觉方面的算法和代码
  • APM32f003替换STM32进行低成本系统开发

    STM32F003是基于Arm Cortex M0内核的32位MCU xff0c 工作电压为2 4 3 6V xff0c 主频48MHz xff0c 内置16KB Flash 定时器 ADC 通信接口 APM32F003系列主频与STM32
  • 【VSCode】Windows 下搭建 C++ 环境

    文章目录 Part I 预备知识Part II 搭建过程Part III 安装较高版本的MinGW Part I 预备知识 MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境 MinGW 收集了一系列免费的Windo
  • 路由器开发————概念理解

    区别 xff1a 静态ip 可以直接使用Internet上网的IP xff08 相当于公网IP xff09 pppoe 从运营商那里动态获取的静态IP的过程就是PPPOE 运营商为了提高他手上拥有的静态IP的利用率 xff0c 而做出的动态
  • 干了三年java外包,我转AI了....

    谈及到程序员外包这件事 xff0c 我想我是比较有发言权的一个 xff0c 即使我现在已经从一个外包公司的JAVA开发转行做人工智能算法 我是2018年毕业的 xff0c 一毕业找的第一份工作就是一家外包公司 xff0c 主要做的是承接甲方
  • 人工智能的算法有哪些?AI常用算法

    人工智能 xff08 AI xff09 是一个非常广泛的领域 xff0c 其中包含许多不同的算法和技术 以下是一些常见的人工智能算法 xff1a 人工智能的算法有哪些 xff1f 机器学习 xff08 Machine Learning xf
  • 卡尔曼滤波五个公式各个参数的意义

    卡尔曼滤波五个公式各个参数的意义 wccsu1994 2018 11 30 10 49 33 45928 收藏 218 分类专栏 xff1a 卡尔曼滤波 版权 系统的状态方程为 xff1a 这个状态方程是根据上一时刻的状态和控制变量来推测此
  • FutureTask 示例

    1 简单示例 2 泡茶 1 简单示例 创建 FutureTask FutureTask lt Integer gt futureTask 61 new FutureTask lt gt gt 1 43 2 创建并启动线程 Thread t1
  • Centos6.5下进行PHP版本升级

    统计插件 WP Statistics 要求PHP5 4以上 xff0c 可本机PHP为5 3 3 xff0c 无奈只有对服务器PHP进行升级 xff0c 遂写下本文 Step1 xff1a 查看安装服务器当前安装版本 php V Step2
  • 一段日子的结束, 也是一段日子的开始

    一个朋友说的 xff0c 一段日子的结束 xff0c 也是另一段日子的开始 也正是我现在的状态 xff0c 我结束了一段往事 xff0c 也因此开始了一段日子 xff0c 曾经的曾经已离我远去 昨天和好朋友聊天到很晚 xff0c 谈了很多
  • 岁月静好

    不是说马年会马上转运的 xff0c 是不是蛇年的时候前半年太幸福了 xff0c 用了太多的好人品 xff0c 各种奖学金 xff0c 各种申请中标 xff0c 各种荣誉 xff0c 然后我要还了 小猴子说我开始会依赖人了 xff0c 哈哈
  • STM32 中重定向printf 和 scanf

    uart c 如果使用 pragma import use no semihosting 则在MDK中不勾选use Microlib 当前代码直接重定向没使用 pragma import use no semihosting 故需要选择us
  • Ubuntu环境下Pixhawk原生固件PX4的编译

    Ubuntu下Pixhawk原生固件PX4的编译这个问题困扰了两天时间 xff0c 可能是博主脑力不够 xff0c 主要是环境搭建不起来 xff0c 主要原因应该是路径的原因 xff0c 最后在大师傅的帮助下还好成功将路径搭建好 xff0c
  • 远程连接虚拟机的Network error: Connection timed out问题

    MobaXterm远程连接虚拟机的Network error Connection timed out问题 我使用的是MobaXterm远程连接我使用VMware创建的虚拟机 更新一下 xff1a 如果出现这种问题 xff0c 极大可能是服
  • springboot项目接入天猫精灵

    springboot项目接入天猫精灵 最近工作需要使用到天猫精灵的语音功能 xff0c 大体是通过呼叫对应的 调用词 实现携带参数 xff0c 然后调用我项目中的接口 xff0c 以实现对应的业务 所以在此简单的记录下使用过程 实际上 xf
  • Lesson 9.2&9.3&9.4 黑箱:不可解释的深层神经网络&探索多层神经网络:层vsh(z)

    二 黑箱 xff1a 深层神经网络的不可解释性 首先从结构上来看 xff0c 多层神经网络比单层神经网络多出了 中间层 中间层常常被称为隐藏层 xff08 hidden layer xff09 xff0c 理论上来说可以有无限层 xff0c
  • UnicodeEncodeError: 'gbk' codec can't encode character ...

    使用Python写文件的时候 xff0c 或者将网络数据流写入到本地文件的时候 xff0c 大部分情况下会遇到 xff1a UnicodeEncodeError 39 gbk 39 codec can 39 t encode charact
  • 一文简单了解并构建DockerFile

    GreatSQL社区原创内容未经授权不得随意使用 xff0c 转载请联系小编并注明来源 GreatSQL是MySQL的国产分支版本 xff0c 使用上与MySQL一致 作者 xff1a 蟹黄瓜子文章来源 xff1a GreatSQL社区投稿
  • 头文件中定义和声明的问题

    头文件中定义和声明的问题 1 头文件中不可以放变量的定义 xff01 一般头文件中只是放变量的声明 xff0c 因为头文件要被其他文件包含 include xff0c 如果把定义放在头文件的话 xff0c 就不能避免多次定义变量 C 43