最主要的作用:
1、防止头文件的重复包含和编译;
下面是错误示范:
headfile_1.h
1 #include
2 class CTest_1 {
3CTest_1() {
4//do something,eg:init;
5}
6~CTest_1() {
7//do something ,eg:free;
8}
9void PrintScreen()
10{
11std::cout << "this is Class CTest_1!" << std::endl;
12}
13 };
headfile_2.h
1 #include "headfile_1.h"
2 class CTest_2 {
3CTest_2() {
4//do something,eg:init;
5}
6~CTest_2() {
7//do something,eg:free;
8}
9void PrintScreen()
10{
11std::cout << "this is Class CTest_2!" << std::endl;
12}
13 };
sourcefile.cpp
1 #include
2 #include "headfile_1.h"
3 #include "headfile_2.h"
4
5 int main()
6 {
7return 0;
8 }
编译时提示重定义:
一般地,假如有一个C源文件(如sourcefile.cpp),它包含两个头文件(如headfile_1.h和headfile_2.h),而头文件headfile_2.h又包含了headfile_1.h,则最终的效果是该源文件包含了两次headfile_1.h。如果你在头文件里定义了结构体或者类类型,那么问题来了,编译时将会报重复定义的错误。
【#ifndef作用】加上条件编译"ifndef"则问题可解决。在headfile_1.h中加上条件编译,如下:
headfile_1.h
1 #ifndef _HEADFILE_1_H
2 #define _HEADFILE_1_H
3 #include
4 class CTest_1 {
5CTest_1() {
6//do something,eg:init;
7}
8~CTest_1() {
9//do something ,eg:free;
10}
11void PrintScreen()
12{
13std::cout << "this is Class CTest_1!" << std::endl;
14}
15 };
16
17 #endif//end of _HEADFILE_1_H
编译通过!
分析:当第一次包含headfile_1.h时,由于没有定义_HEADFILE_1_H,条件为真,这样就会执行#ifndef _HEADFILE_1_H和#endif之间的代码;当第二次包含headfile_1.h时,前面一次已经定义了_HEADFILE_1_H,条件为假,#ifndef _HEADFILE_1_H和#endif之间的代码也就不会再次被包含,这样就避免了重定义。
推荐阅读
- 数据结构与算法|315,关于《C程序设计伴侣》一书致人民邮电出版社的公开信
- #|C语言
- c/c++|嵌入式C语言自我修养 01(Linux 内核中的GNU C语言语法扩展)
- c++编程|教你了解什么是C语言(快来看看吧)
- C/C++编程语言中的指针(pointer)你了解吗
- c/c++|step1 . day2(Linux系统基础知识)
- c/c++|step1.day12 Linux下使用C语言编程基础总结
- C|内存管理那些事儿_指针参数是如何传递内存的?
- C/C++|有趣的C语言指针(二)——指针声明的那些事儿