C++头文件保护符和变量的声明定义
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++头文件保护符和变量的声明定义相关推荐
- 预处理器预处理变量头文件保护条件编译
[常见的预处理功能] #include 头文件保护符 条件编译 [预处理器] 编译之前执行的一段程序,可以部分地改变我们所写的程序 举个例子:当预处理器看到#include标记时就会用指定的头文件的内 ...
- C/C++头文件与变量的声明和定义
版权声明:本文为博主转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接:https://blog.csdn.net/mountzf/article/deta ...
- 基本语法及基本概念概述(标识符、访问修饰符、变量、数组、枚举、注释、空行、继承、接口、(对象、类、方法、实例变量)、关键字表)
文章目录 1.标识符 2.标识符命名规范 3.访问修饰符 4.变量 5.数组 6. 枚举 7.注释 8.空行 9.继承 10.接口 11.对象.类.方法.实例 12.关键字表 13.保留字(reser ...
- 在c语言中函数的定义变量的值为,变量定义(C语言中变量的声明和定义)
变量定义(C语言中变量的声明和定义),哪吒游戏网给大家带来详细的变量定义(C语言中变量的声明和定义)介绍,大家可以阅读一下,希望这篇变量定义(C语言中变量的声明和定义)可以给你带来参考价值. 3.函数 ...
- python语言变量随时声明_2. Go语言五种变量创建的方法
对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的. Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变 ...
- java 接口中变量修饰符,Java的访问修饰符与变量的作用域讲解
Java访问修饰符(访问控制符) Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: ? Java 的修饰符很多,分为访问修饰符和非访问修饰符.本节仅介绍访问修 ...
- Go语言核心之美 1.2-变量及声明篇
变量 1.声明变量 使用var关键字可以创建一个指定类型的变量: var i int = 0 var i = 0 var i int 以上三个表达式均是合法的,第三个表达式会将i初始化为int类型的零 ...
- c++/c中的预编译,文件包含伪指令,#include,包含哨卫,头文件保护
c++/c中的预编译处理: 预编译伪指令一般以#开头,前面只能是空白字符,其本身不是c/c++语句,可以出现在程序的任何地方,只要其展开后复合语法规则并且有效即可,其位置可以是头文件,函数体,控制结构 ...
- 【贪玩巴斯】Unity初学圣经Part2-C#基础——Day 01:C#基础之——命名空间、类、方法、变量的声明赋值和相关知识以及.NETC#关系讲解 2022年3月28日
C#基础之--命名空间.类.方法.变量的声明赋值和相关知识以及.NETC#关系讲解 对应视频4-1至4-7 1.引入命名空间: 2.引入类.方法 3.变量的声明赋值 4.综合小练习 5. .NET的介 ...
最新文章
- [译] JavaScript 中的 CSS:基于组件的样式的未来
- nodejs模块加载分析(1).md
- 史上最全 BAT 大厂面试题整理
- UE4 查看打包文件内容
- 性能为MySQL 10倍!阿里云推出云原生数据仓库AnalyticDB基础版
- python 数组去重复_numpy数组去掉重复的行,保留唯一的行数据
- html文档中strokestyle,HTML5画布的StrokeStyle?(html5 canvas strokeStyle?)
- java jxta_JXTA——JAVA P2P网络编程技术(入门篇) | 学步园
- 计算机实训学校目的和要求,计算机实习目的和要求
- set_global_opts在PyEcharts中实现全局配置项
- 弄了一整天,终于把打印自定义纸张大小搞定了
- 家用 NAS 服务器(1)| 配置选择及准备
- 基于ARM的智能灯光控制系统总结(3-主程序及全局数据结构)
- 微信商城商家该如何运营
- yo generator 强制更新文件
- HashMap中的Hash码怎么计算,为什么要这样做?
- 《数值分析(原书第2版)》—— 导读
- php 精品课程,基于PHP的精品课程教学网站
- nodejs常用核心模块介绍
- 福师大计算机考研专硕,福师大性价比最高的管理类专硕!录取分数低,上岸比较容易!...
热门文章
- 正则表达式加参数匹配
- 前端笔记-webpack加载前端资源(图片,css等)
- Qt学习笔记-使用QStyleFactory::create()变换风格
- 网站建设:部署与发布
- 1NF 2NF 3NF BCNF
- ajax视频播放,XMLHttpRequest加载视频并播放
- java简单编程_「4」Java简单编程
- html logo动画效果图,简单CSS3技巧实现的Logo动画
- jsp 导入java类_JSP页面导入问题。类文件放在WEB-INF / classes中的包中
- flashpaper打印机没有被正确安装_条码打印机有哪些常见问题