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内联函数。
相关文章
- C++学习——c++逗号操作符说明(附加全部运算符优先级)
- C++实现二叉树层序遍历
- C++ 中文周刊 第72期
- 深入理解C++11_c++ string char
- c++私有变量和公有变量_没有与指定类型匹配的重载函数实例
- C++基本概念_c语言 c++区别
- C++字符串加密_c++字符串连接函数
- C++ 不知算法系列之初识动态规划算法思想
- c++的链表-C++链表
- c++的链表-C++实现简单链表
- 为什么时不时会看到「珍惜生命,远离 C++」?
- ROS2机器人编程简述humble-第三章-BUMP AND GO IN C++ .3
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
- C++模板初阶
- C++空间配置器
- C++类模板中的静态成员
- 比较C和MySQL 略显不均之下的选择(c++ mysql vs)
- 解析C++中四种强制类型转换的区别详解
- C++中用substr()函数消除前后空格的解决方法详解