<学习笔记>使用#ifndef, #define, #endif
来源:互联网 发布:社交软件如何盈利 编辑:程序博客网 时间:2024/04/29 14:06
- 百度百科关于 #ifndef 的解释: http://baike.baidu.com/view/1617265.htm
- 假若有两个类的头文件 Header_01.h 和 Header_02.h ,定义如下:
- ----------------------------------------------------------------------------------------
- // Header_01.h
- class Header_01
- {
- public:
- int header_01;
- };
- // Header_02.h
- #include "Header_01.h"
- class Header_02
- {
- public:
- Header_01 header01;
- int header02;
- };
- ----------------------------------------------------------------------------------------
- 现在加一个main的cpp文件:
- ----------------------------------------------------------------------------------------
- // IFDefineTest.cpp
- #include <stdio.h>
- #include "Header_02.h"
- void main()
- {
- int c;
- Header_01 h1;
- Header_02 h2;
- h1.header_01 = 1;
- h2.header01.header_01 = 2;
- h2.header02 = 3;
- printf("This is to Test the Define function!\n");
- c = getchar();
- }
- ----------------------------------------------------------------------------------------
- 这样子编译没问题!
- 现在在 IFDefineTest.cpp 加一行 [ #include "Header_01.h"],再编译,编译器(VS 2008)会报错:
- 错误1error C2011: “Header_01”: “class”类型重定义 e:\vs2008\ifdefinetest\ifdefinetest\header_01.h4IFDefineTest
- 错误2error C2079: “Header_02::header01”使用未定义的 class“Header_01”e:\vs2008\ifdefinetest\ifdefinetest\header_02.h10IFDefineTest
- 错误3error C2079: “h1”使用未定义的 class“Header_01” e:\vs2008\ifdefinetest\ifdefinetest\ifdefinetest.cpp 7IFDefineTest
- 错误4error C2228: “.header_01”的左边必须有类/结构/联合 e:\vs2008\ifdefinetest\ifdefinetest\ifdefinetest.cpp 9IFDefineTest
- 错误5error C2228: “.header_01”的左边必须有类/结构/联合 e:\vs2008\ifdefinetest\ifdefinetest\ifdefinetest.cpp10IFDefineTest
- 在 IFDefineTest.cpp 中引用Header_01.h 和 Header_02.h, 而Header_02.h 自身又引用过一次 Header_01.h,相当于Header_01.h 中的 class Header_01 被定义了两次。我觉得编译器在编译的时候,会对class(或者更多)有一个定义表,每当有一个新的定义时,就会对定义表进行遍历,若出现表中已经存在相同目录路径下的class定义,就说明改class被重定义了,编译不让过。
- ----------------------------------------------------------------------------------------
- // Header_01.h
- #ifndef _Header_01_
- #define _Header_01_
- class Header_01
- {
- public:
- int header_01;
- };
- #endif
- // Header_02.h
- #ifndef _Header_02_
- #define _Header_02_
- #include "Header_01.h"
- class Header_02
- {
- public:
- Header_01 header01;
- int header02;
- };
- #endif
- // IFDefineTest.cpp
- #include <stdio.h>
- #include "Header_01.h"
- #include "Header_02.h"
- void main()
- {
- int c;
- Header_01 h1;
- Header_02 h2;
- h1.header_01 = 1;
- h2.header01.header_01 = 2;
- h2.header02 = 3;
- printf("This is to Test the Define function!\n");
- c = getchar();
- }
- ----------------------------------------------------------------------------------------
- 对class Header_01 和 class Header_02 两个所在的文件都进行预定义,那么在第二次引用Header_01.h文件的时候,先检查 宏 _Header_01_ 是不是已经被定义了,如果定义了的话, 宏 _Header_01_ 里面的定义都忽略不再处理。现在在 IFDefineTest.cpp 文件里就算多include 几次 Header_01.h 或 Header_02.h ,编译一样可以过。
- 本着实践的心理去看#ifndef的作用,可以将上面代码中 Header_01.h 或者 Header_02.h 文件里的 #ifndef 的内容删掉再编译,也可以做其他尝试~ 同时也可以看看编译器自己文件的预定义,例如常用的 stdio.h 。
- 这里只有三个文件,一眼就看得出引用的关系。但是在一个大project里面,代码的分支结构比较多,相互引用自然少不了,用#ifndef, #define, #endif 可以免除一些后顾之忧。