最次要的作用:
1、避免头文件的反复蕴含和编译;
上面是谬误示范:
headfile_1.h
1 #include <iostream>
2 class CTest_1 {3 CTest_1() {
4 //do something,eg:init;
5 }
6 ~CTest_1() {
7 //do something ,eg:free;
8 }
9 void PrintScreen()
10 {
11 std::cout << "this is Class CTest_1!" << std::endl;
12 }
13 };
headfile_2.h
1 #include "headfile_1.h"
2 class CTest_2 {3 CTest_2() {
4 //do something,eg:init;
5 }
6 ~CTest_2() {
7 //do something,eg:free;
8 }
9 void PrintScreen()
10 {
11 std::cout << "this is Class CTest_2!" << std::endl;
12 }
13 };
sourcefile.cpp
1 #include <iostream>
2 #include "headfile_1.h"
3 #include "headfile_2.h"
4
5 int main()
6 {
7 return 0;
8 }
编译时提醒重定义:
个别地,如果有一个 C 源文件(如 sourcefile.cpp),它蕴含两个头文件(如 headfile_1.h 和 headfile_2.h),而头文件 headfile_2.h 又蕴含了 headfile_1.h,则最终的成果是该源文件蕴含了两次 headfile_1.h。如果你在头文件里定义了构造体或者类类型,那么问题来了,编译时将会报反复定义的谬误。
加上条件编译 ”ifndef” 则问题可解决。在 headfile_1.h 中加上条件编译,如下:
headfile_1.h
1 #ifndef _HEADFILE_1_H
2 #define _HEADFILE_1_H
3 #include <iostream>
4 class CTest_1 {5 CTest_1() {
6 //do something,eg:init;
7 }
8 ~CTest_1() {
9 //do something ,eg:free;
10 }
11 void PrintScreen()
12 {
13 std::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 之间的代码也就不会再次被蕴含,这样就防止了重定义。