版权声明:本文为博主转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/mountzf/article/details/51767353

最近遇到了变量重复包含的问题,才发现自己有好多知识已经模糊了,真惭愧。首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,头文件主要作用有两个:一是把很多其他文件需要重复使用的函数变量等在此声明,在需要的地方include;二是给使用你函数文件的人看的。那既然是说明,那么头文件里面放的自然就是关于函数,变量,类的“声明”了。记着,是“声明”,不是“定义”。
那么,大家知道声明和定义的区别。所以,最好不要在头文件里定义什么东西。比如全局变量:

/*xx头文件*/
#ifndef _XX_头文件.H
#define _XX_头文件.H
int A;
#endif

那么,很糟糕的是,这里的int A是个全局变量的定义,如果这个头文件被多次引用的话,你的A会被重复定义。

变量的定义:为变量分配存储空间,同时指明变量的类型和名字。另外变量的初始化,就是在变量的定义出给出值。

变量的声明:它主要向程序声明变量的类型和名字。定义也是声明(这是许多人搞不清楚的地方),那既然变量的定义就是声明,为啥还要再多出来个变量的声明这个概念,直接就用变量的定义不是就可以了?

其实不然,C++中有个关键字是用来声明变量的,它是extern。它声明一个变量却不定义它,即不在给它一个存储空间。要在包含该文件的文件中使用此变量应该声明全局变量“extern int A”。

头文件中变量如果没有初始化就是声明;初始化了就是定义,此时被包含之后会发生重复定义的错误。全局变量的定义宜放在某个 .c 文件中,而 .h 文件里写的是变量的声明。头文件应用于声明而不是用于定义。

其实,C++标准并没有规定头文件中不能定义 变量,只不过如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。这和头文件中的函数声明不同,因为函数在头文件中仅仅是声明,声明可以有多个,但是无论是函数还是变量定义都只能有一个,否则就会发生重复定义的错误。

并不是所有的变量都能用extern声明,只有全局变量并且没有被static 声明的变量才能声明为extern. 所以如果你不想自己源文件中全局的变量被其他文件引用,你就可以给变量加上static声明。

非const变量默认为extern const变量默认为文件的局部变量。而const变量如果想要在其他文件里被访问,必须显示的指定它为extern。如果const对象在编译时可以确定其值,可以将其放在头文件中定义。这么做是有原因的——const对象默认情况下是定义该变量的文件的局部变量,这样即使此头文件被多个包含,都不会在包含这些文件中重复定义此变量,所有对于这个const对象的引用全都指向在头文件中定义的对象。如果在const对象定义的时候声明extern,const对象就变得和普通非const对象一样,从而失去此特性(非const对象的默认属性为extern)。

所以,总结如下:

  • 如果是要定义全局变量,那么在头文件中用extern关键字声明,然后在另一个.cpp文件中定义;
  • 如果是要声明一个不想被其他文件使用、只能被本文件使用的变量,可以用static关键字在头文件中进行定义;
  • 如果所要定义的变量为局部变量,并且其值在编译时就已经可以确定,就可以用const关键词在头文件中进行定义。

祝枫
2016年6月27日于深圳

C/C++头文件与变量的声明和定义相关推荐

  1. C11的对齐特性是在新的头文件中stdalign.h声明的

    void*aligned_alloc(size_t algn,size_t size); 分配size字节以algn字节对齐的内存,并返回指向所分配内存的指针. C11的对齐特性是在新的头文件中< ...

  2. 侯捷-C++面向对象高级开发(头文件与类的声明,构造函数,参数传递与返回值)

    侯捷-C++面向对象高级开发 1.头文件与类的声明 Object Based:面对的是单一的class的设计 Object Oriented:面对的是多重classes的设计,classes和clas ...

  3. 侯捷C++->头文件与类的声明

    1.class经典分类:带指针和不带指针 2.头文件的防卫式声明 #ifndef _COMPLEX_ #define _COMPLEX_ ... #endif 3.class template //先 ...

  4. 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)

    变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...

  5. [C++再学习系列] 变量的声明、定义与extern关键字

    变量的声明与定义: A definition of a variable allocates storage for thevariable and may also specify an initi ...

  6. 【C语言】函数 ---- 函数的嵌套调用和链式访问、函数的声明和定义、变量的声明和定义、函数递归与迭代、递归时的栈溢出问题

    函数 一.函数的嵌套调用和链式访问 1.嵌套调用 2.链式访问 2.1strlen()函数 2.2printf()函数 二.函数的声明和定义 1.函数声明和定义的介绍 2.函数声明和定义的使用 三.变 ...

  7. 函数、变量的声明和定义

    1.函数的声明和定义 函数一般由两部分组成:1)声明部分:2)执行语句. 1.1)函数的声明是函数的原型 声明部分的作用:对有关标识符的属性进行说明. 标识符例如变量.函数体.结构体.共用体等. 1. ...

  8. C++头文件的防卫式声明(为了防止多次include)

    C++的某个头文件通常需要被多个文件include,为了防止同一个头文件被包含多次导致了重复定义,需要在头文件中加上以防卫式声明,例如对于头文件的"complex.h",其防卫式声 ...

  9. (二)C++头文件与类的声明

    目录 一.C vs C++,关于数据和函数 二.class分类 2.1 complex(经典不带指针--复数) 2.2 string(经典带指针--字符串) 三.Object Based(基于对象)v ...

最新文章

  1. [unreal4入门系列之八] 使用VS编译UE4编辑器并添加物体到场景中
  2. 腾讯视频怎么开启运营商网络自动播放
  3. ltspice 双脉冲_焊烟脉冲布袋式除尘器制作
  4. 超详细的Java面试题总结(一)之Java基础知识篇
  5. html的article标签,介绍一个html5做的网站,以及article标签的用法
  6. oracle exadata X8,ORACLEEXADATA数据库云服务器X8.PDF
  7. 有些东西还得记下来,看过了又忘了,找起来又难找 (fluxbox, ab, seige)
  8. safari快捷图标不见了_桌面图标不见了怎么办?这里有妙招
  9. oracle length
  10. 利用Photoshop对证件照换底且抠出头发丝
  11. 安装autoconf
  12. Python中如何读取npy、npz文件?
  13. Android 获取应用列表
  14. motan学习笔记 二 motan架构分析
  15. Django 表单验证之自定义表单验证器
  16. 客厅风水中钟表的摆设要注意什么?
  17. 虎年兴「书」礼,速来认领国际发布物,对话行业翘楚 #1月期
  18. 怒!移动免费上网卡是骗人的!还是黑我的手机费!
  19. 三极管常用封装的引脚排列
  20. java中求质数(素数)的问题

热门文章

  1. jsf服务_使用JSF的面向服务的UI
  2. 工厂方法设计模式示例
  3. manifest.mf._MANIFEST.MF和feature.xml版本控制规则
  4. jsf集成spring_JSF 2,PrimeFaces 3,Spring 3和Hibernate 4集成项目
  5. 在使用Gradle构建的Spring Boot应用程序中覆盖Spring Framework版本
  6. rabbitmq订单模块_RabbitMQ播放模块! 构架
  7. 学习Netflix管理员–第1部分
  8. Java应用程序中的内存泄漏和内存管理
  9. Arrays.sort与Arrays.parallelSort
  10. Play 2.0框架和XA交易