1、#ifndef #define #endif头文件保护符

在编译的过程中,每个.cpp文件被看成一个单独的文件来编译成单独的编译单元,#ifndef 保证类的头文件在同一个.cpp文件里被多次引用后不会出现重定义问题。

注意:仅仅是防止在同一个.cpp文件里被多次引用。

样例:

// file1.h
class file1
{
};// file2.h
#include "file1.h"
class file2
{
};// file3.h
#include "file1.h"
#include "file2.h"

file3.h展开来是这种:

// file1.h展开的内容
class file1
{
};
// file2.h展开的内容
class file1
{
};
class file2
{
};

这时候就会出现重定义了,假设在每一个文件加上#ifndef头文件保护符:

// file1.h
#ifndef _FILE1_H_
#define _FILE1_H_class file1
{
};#endif // !_FILE1_H_
// file2.h
#ifndef _FILE2_H_
#define _FILE2_H_#include "file1.h"
class file2
{
};#endif // !_FILE2_H_
// file3.h
#ifndef _FILE3_H_
#define _FILE3_H_#include "file1.h"
#include "file2.h"#endif // !_FILE3_H_

这时候展开file3.h时,由于_FILE1_H_仅仅会被定义一次。所以就不会出现重定义错误。

2、变量的声明和定义

定义:用于为变量分配存储空间,还能够为变量指定初始值。在一个程序中,变量有且仅有一个定义。

声明:用于向程序表明变量的类型和名字。在一个程序中。声明能够有多个。定义也是声明:当定义变量时我们声明了它的类型和名字。能够通过使用externkeyword声明变量名而不定义它:extern int i;。

样例:

// file1.h
#ifndef _FILE1_H_
#define _FILE1_H_int a = 1;#endif // !_FILE1_H_
// file2.h
#ifndef _FILE2_H_
#define _FILE2_H_#include "file1.h"#endif // !_FILE2_H_
// main.cpp
#include <iostream>int main()
{extern int a;std::cout << a << std::endl;system("pause");return 0;
}

这时候编译会报错,由于在file1.h定义了a。在file2.h的展开中又定义了a。

有人会问。#ifndef不是防止重定义的吗?#ifndef是防止在同一个文件的重定义,在上面的情况,file1.h和file2.h是两个不同的文件。所以会在file1.h和file2.h同一时候出现int a = 1,就出现重定义错误了。

所以不要在头文件定义变量,最好的做法是:在头文件声明变量,在.cpp定义变量,在须要使用该变量的地方先声明再使用。

改动下上面的样例:

// file1.h
#ifndef _FILE1_H_
#define _FILE1_H_extern int a;#endif // !_FILE1_H_
// file1.cpp
#include "file1.h"int a = 1;
// file2.h
#ifndef _FILE2_H_
#define _FILE2_H_#include "file1.h"#endif // !_FILE2_H_

main.cpp不变。这时候就能够正常执行了。

3、能够在头文件定义的三个例外

(1)类的定义。

类的定义很多其它像是声明,由于此时并没有分配空间。

(2)值在编译时就已知的const对象。

如:const char c = 'c';,这个是在编译时就已经确定值的。之后程序不能改变。

而const char *c = 'c';是不能够的,由于指针不是在编译时确定值的。

(3)inline内联函数。

转载于:https://www.cnblogs.com/bhlsheji/p/5116129.html

C++头文件保护符和变量的声明定义相关推荐

  1. 预处理器预处理变量头文件保护条件编译

    [常见的预处理功能] #include 头文件保护符 条件编译 [预处理器] 编译之前执行的一段程序,可以部分地改变我们所写的程序 举个例子:当预处理器看到#include标记时就会用指定的头文件的内 ...

  2. C/C++头文件与变量的声明和定义

    版权声明:本文为博主转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接:https://blog.csdn.net/mountzf/article/deta ...

  3. 基本语法及基本概念概述(标识符、访问修饰符、变量、数组、枚举、注释、空行、继承、接口、(对象、类、方法、实例变量)、关键字表)

    文章目录 1.标识符 2.标识符命名规范 3.访问修饰符 4.变量 5.数组 6. 枚举 7.注释 8.空行 9.继承 10.接口 11.对象.类.方法.实例 12.关键字表 13.保留字(reser ...

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

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

  5. python语言变量随时声明_2. Go语言五种变量创建的方法

    对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的. Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变 ...

  6. java 接口中变量修饰符,Java的访问修饰符与变量的作用域讲解

    Java访问修饰符(访问控制符) Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: ? Java 的修饰符很多,分为访问修饰符和非访问修饰符.本节仅介绍访问修 ...

  7. Go语言核心之美 1.2-变量及声明篇

    变量 1.声明变量 使用var关键字可以创建一个指定类型的变量: var i int = 0 var i = 0 var i int 以上三个表达式均是合法的,第三个表达式会将i初始化为int类型的零 ...

  8. c++/c中的预编译,文件包含伪指令,#include,包含哨卫,头文件保护

    c++/c中的预编译处理: 预编译伪指令一般以#开头,前面只能是空白字符,其本身不是c/c++语句,可以出现在程序的任何地方,只要其展开后复合语法规则并且有效即可,其位置可以是头文件,函数体,控制结构 ...

  9. 【贪玩巴斯】Unity初学圣经Part2-C#基础——Day 01:C#基础之——命名空间、类、方法、变量的声明赋值和相关知识以及.NETC#关系讲解 2022年3月28日

    C#基础之--命名空间.类.方法.变量的声明赋值和相关知识以及.NETC#关系讲解 对应视频4-1至4-7 1.引入命名空间: 2.引入类.方法 3.变量的声明赋值 4.综合小练习 5. .NET的介 ...

最新文章

  1. [译] JavaScript 中的 CSS:基于组件的样式的未来
  2. nodejs模块加载分析(1).md
  3. 史上最全 BAT 大厂面试题整理
  4. UE4 查看打包文件内容
  5. 性能为MySQL 10倍!阿里云推出云原生数据仓库AnalyticDB基础版
  6. python 数组去重复_numpy数组去掉重复的行,保留唯一的行数据
  7. html文档中strokestyle,HTML5画布的StrokeStyle?(html5 canvas strokeStyle?)
  8. java jxta_JXTA——JAVA P2P网络编程技术(入门篇) | 学步园
  9. 计算机实训学校目的和要求,计算机实习目的和要求
  10. set_global_opts在PyEcharts中实现全局配置项
  11. 弄了一整天,终于把打印自定义纸张大小搞定了
  12. 家用 NAS 服务器(1)| 配置选择及准备
  13. 基于ARM的智能灯光控制系统总结(3-主程序及全局数据结构)
  14. 微信商城商家该如何运营
  15. yo generator 强制更新文件
  16. HashMap中的Hash码怎么计算,为什么要这样做?
  17. 《数值分析(原书第2版)》—— 导读
  18. php 精品课程,基于PHP的精品课程教学网站
  19. nodejs常用核心模块介绍
  20. 福师大计算机考研专硕,福师大性价比最高的管理类专硕!录取分数低,上岸比较容易!...

热门文章

  1. 正则表达式加参数匹配
  2. 前端笔记-webpack加载前端资源(图片,css等)
  3. Qt学习笔记-使用QStyleFactory::create()变换风格
  4. 网站建设:部署与发布
  5. 1NF 2NF 3NF BCNF
  6. ajax视频播放,XMLHttpRequest加载视频并播放
  7. java简单编程_「4」Java简单编程
  8. html logo动画效果图,简单CSS3技巧实现的Logo动画
  9. jsp 导入java类_JSP页面导入问题。类文件放在WEB-INF / classes中的包中
  10. flashpaper打印机没有被正确安装_条码打印机有哪些常见问题