<学习笔记>使用#ifndef, #define, #endif

来源:互联网 发布:社交软件如何盈利 编辑:程序博客网 时间:2024/04/29 14:06

  1. 百度百科关于 #ifndef 的解释: http://baike.baidu.com/view/1617265.htm
  2. 假若有两个类的头文件 Header_01.h 和 Header_02.h ,定义如下:
  3. ----------------------------------------------------------------------------------------
  4. // Header_01.h
  5. class Header_01
  6. {
  7. public:
  8.  int header_01;
  9. };
  10. // Header_02.h
  11. #include "Header_01.h"
  12. class Header_02
  13. {
  14. public:
  15. Header_01 header01;
  16. int header02;
  17. };
  18. ----------------------------------------------------------------------------------------
  19. 现在加一个main的cpp文件:
  20. ----------------------------------------------------------------------------------------
  21. // IFDefineTest.cpp
  22. #include <stdio.h>
  23. #include "Header_02.h"
  24. void main()
  25. {
  26.     int c;
  27. Header_01 h1;
  28. Header_02 h2;
  29. h1.header_01 = 1;
  30. h2.header01.header_01 = 2;
  31. h2.header02 = 3;
  32. printf("This is to Test the Define function!\n");
  33.     c = getchar();
  34. }
  35. ----------------------------------------------------------------------------------------
  36. 这样子编译没问题!
  37. 现在在 IFDefineTest.cpp 加一行 [ #include "Header_01.h"],再编译,编译器(VS 2008)会报错:
  38. 错误1error C2011: “Header_01”: “class”类型重定义                                        e:\vs2008\ifdefinetest\ifdefinetest\header_01.h4IFDefineTest
  39. 错误2error C2079: “Header_02::header01”使用未定义的 class“Header_01”e:\vs2008\ifdefinetest\ifdefinetest\header_02.h10IFDefineTest
  40. 错误3error C2079: “h1”使用未定义的 class“Header_01”                                e:\vs2008\ifdefinetest\ifdefinetest\ifdefinetest.cpp 7IFDefineTest
  41. 错误4error C2228: “.header_01”的左边必须有类/结构/联合                           e:\vs2008\ifdefinetest\ifdefinetest\ifdefinetest.cpp 9IFDefineTest
  42. 错误5error C2228: “.header_01”的左边必须有类/结构/联合                                e:\vs2008\ifdefinetest\ifdefinetest\ifdefinetest.cpp10IFDefineTest
  43. 在 IFDefineTest.cpp 中引用Header_01.h 和 Header_02.h, 而Header_02.h 自身又引用过一次 Header_01.h,相当于Header_01.h 中的 class Header_01 被定义了两次。我觉得编译器在编译的时候,会对class(或者更多)有一个定义表,每当有一个新的定义时,就会对定义表进行遍历,若出现表中已经存在相同目录路径下的class定义,就说明改class被重定义了,编译不让过。
  44. ----------------------------------------------------------------------------------------
  45. // Header_01.h
  46. #ifndef _Header_01_
  47. #define _Header_01_
  48. class Header_01
  49. {
  50. public:
  51.  int header_01;
  52. };
  53. #endif 

  54. // Header_02.h
  55. #ifndef _Header_02_
  56. #define _Header_02_
  57. #include "Header_01.h"
  58. class Header_02
  59. {
  60. public:
  61. Header_01 header01;
  62. int header02;
  63. };
  64. #endif

  65. // IFDefineTest.cpp
  66. #include <stdio.h>
  67. #include "Header_01.h"
  68. #include "Header_02.h"
  69. void main()
  70. {
  71.  int c;
  72. Header_01 h1;
  73. Header_02 h2;
  74. h1.header_01 = 1;
  75. h2.header01.header_01 = 2;
  76. h2.header02 = 3;
  77. printf("This is to Test the Define function!\n");
  78.  c = getchar();
  79. }
  80. ----------------------------------------------------------------------------------------
  81. 对class Header_01 和 class Header_02 两个所在的文件都进行预定义,那么在第二次引用Header_01.h文件的时候,先检查 宏 _Header_01_ 是不是已经被定义了,如果定义了的话, 宏 _Header_01_ 里面的定义都忽略不再处理。现在在 IFDefineTest.cpp 文件里就算多include 几次 Header_01.h 或 Header_02.h ,编译一样可以过。
  82. 本着实践的心理去看#ifndef的作用,可以将上面代码中 Header_01.h 或者 Header_02.h 文件里的 #ifndef 的内容删掉再编译,也可以做其他尝试~ 同时也可以看看编译器自己文件的预定义,例如常用的 stdio.h 。 
  83. 这里只有三个文件,一眼就看得出引用的关系。但是在一个大project里面,代码的分支结构比较多,相互引用自然少不了,用#ifndef, #define, #endif 可以免除一些后顾之忧。 


原创粉丝点击