如何使用编译开关建立可移植的代码.txt 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. 如何使用编译开关建立可移植的代码
  2. 作者:Riceball(riceball@cq118.com or riceballl@hotmail.com)
  3. Date: 2002-3-3
  4. 更新:周劲羽(zjy@cnpack.org) 增加对 Delphi/BCB 7 的说明
  5. Data: 2002-9-10
  6. 难度:中
  7. 我们使用编译开关可以帮助我们在同一文件中适应不同版本的Delphi(Pascal)编译器,同时支持多个版本的编译器。下面是不同版本的编译器的条件定义列表。
  8. 不同版本编译器的条件定义:
  9. _____________________________
  10. 版本 条件定义指令
  11. Delphi 1 VER80
  12. Delphi 2 VER90
  13. C++Builder 1 VER93
  14. Delphi 3 VER100
  15. C++Builder 3 VER110
  16. Delphi 4 VER120
  17. C++Builder 4 VER125
  18. Delphi 5 VER130
  19. C++Builder 5 VER130
  20. Kylix 1 VER140
  21. Delphi 6 VER140
  22. C++Builder 6 VER140
  23. Delphi 7 VER150
  24. C++Builder 7 VER150
  25. 尽管大多数的Delphi代码在不同版本中编译是完全没有问题的,但是依然有少数代码需要在不同的编译器下作稍许的修改,使用编译开关你就可以在同一文件中支持多个版本,象这样:
  26. {$IFDEF VER80}
  27. Delphi 1 code goes here
  28. {$ENDIF}
  29. {$IFDEF VER90}
  30. Delphi 2 code goes here
  31. {$ENDIF}
  32. {$IFDEF VER93}
  33. C++Builder 1 code goes here
  34. {$ENDIF}
  35. {$IFDEF VER100}
  36. Delphi 3 code goes here
  37. {$ENDIF}
  38. {$IFDEF VER110}
  39. C++Builder 3 code goes here
  40. {$ENDIF}
  41. {$IFDEF VER120}
  42. Delphi 4 and C++Builder 4 code goes here
  43. {$ENDIF}
  44. {$IFDEF VER130}
  45. Delphi and C++Builder 5 code goes here
  46. {$ENDIF}
  47. {$IFDEF VER140}
  48. Delphi 6 and Kylix code goes here
  49. {$ENDIF}
  50. {$IFDEF VER150}
  51. Delphi 7 and Kylix code goes here
  52. {$ENDIF}
  53. 不过,这并不是一个完整的漂亮的解决方案--看着这些VERxxx,你会觉得如同在读天书。Delphi的每一次的版本变化,功能都有所不同,如:在Delphi3以上的版本中增加对Interface的支持,在Delphi4以上的版本增加了对动态数组的支持等等。
  54. 在这里提供两个包含文件,供你参考。一个是Jedi.inc文件,它提供了关于编译器的信息以及所支持的功能的条件编译信息。另一个是Setting.inc文件,它将Jedi.inc链接了进来,并设置了程序所需要的参数开关, 你可以根据项目的需要进行更改。
  55. Jedi.inc 提供了如下的条件定义指令:
  56. 一、开发环境指令
  57. 指令 说明
  58. ------------------------------------------------------------------------------
  59. DELPHI 当使用 Delphi 编译时该指令被定义
  60. BCB 当使用 C++Builder 编译时该指令被定义
  61. 二、操作平台指令
  62. 指令 说明
  63. ------------------------------------------------------------------------------
  64. MSWINDOWS 当目标平台是 MS Windows [Added By Riceball]
  65. WIN16 当目标平台是 16位 Windows [Added By Riceball]
  66. WIN32 当目标平台是 32位 Windows
  67. LINUX 当目标平台是 Linux
  68. 三、Delphi版本指令
  69. 将 VerXXX 指令映射成容易记住的Delphi版本名称。
  70. 指令 说明
  71. ------------------------------------------------------------------------------
  72. DELPHI1 当使用 Delphi 1 编译时该指令被定义
  73. DELPHI2 当使用 Delphi 2 编译时该指令被定义
  74. DELPHI3 当使用 Delphi 3 编译时该指令被定义
  75. DELPHI4 当使用 Delphi 4 编译时该指令被定义
  76. DELPHI5 当使用 Delphi 5 编译时该指令被定义
  77. DELPHI6 当使用 Delphi 6 编译时该指令被定义
  78. DELPHI7 当使用 Delphi 7 编译时该指令被定义
  79. DELPHI1_UP 当使用 Delphi 1 或更高版本的编译器编译时该指令被定义
  80. DELPHI2_UP 当使用 Delphi 2 或更高版本的编译器编译时该指令被定义
  81. DELPHI3_UP 当使用 Delphi 3 或更高版本的编译器编译时该指令被定义
  82. DELPHI4_UP 当使用 Delphi 4 或更高版本的编译器编译时该指令被定义
  83. DELPHI5_UP 当使用 Delphi 5 或更高版本的编译器编译时该指令被定义
  84. DELPHI6_UP 当使用 Delphi 6 或更高版本的编译器编译时该指令被定义
  85. DELPHI7_UP 当使用 Delphi 7 或更高版本的编译器编译时该指令被定义
  86. 四、C++Builder 版本指令
  87. 将 VerXXX 指令映射成容易记住的C++Builder版本名称。
  88. 指令 说明
  89. ------------------------------------------------------------------------------
  90. BCB1 当使用 C++Builder 1 编译时该指令被定义
  91. BCB3 当使用 C++Builder 3 编译时该指令被定义
  92. BCB4 当使用 C++Builder 4 编译时该指令被定义
  93. BCB5 当使用 C++Builder 5 编译时该指令被定义
  94. BCB6 当使用 C++Builder 6 编译时该指令被定义
  95. BCB7 当使用 C++Builder 7 编译时该指令被定义
  96. BCB1_UP 当使用 C++Builder 1 或更高版本的编译器编译时该指令被定义
  97. BCB3_UP 当使用 C++Builder 3 或更高版本的编译器编译时该指令被定义
  98. BCB4_UP 当使用 C++Builder 4 或更高版本的编译器编译时该指令被定义
  99. BCB5_UP 当使用 C++Builder 5 或更高版本的编译器编译时该指令被定义
  100. BCB6_UP 当使用 C++Builder 6 或更高版本的编译器编译时该指令被定义
  101. BCB7_UP 当使用 C++Builder 7 或更高版本的编译器编译时该指令被定义
  102. 五、编译器版本指令
  103. 将 VerXXX 指令映射成容易记住的编译器版本名称。
  104. 指令 说明
  105. ------------------------------------------------------------------------------
  106. COMPILER1 当使用 Delphi 1 编译时该指令被定义
  107. COMPILER2 当使用 Delphi 2 或 C++Builder 1 编译时该指令被定义
  108. COMPILER3 当使用 Delphi 3 编译时该指令被定义
  109. COMPILER35 当使用 C++Builder 3 编译时该指令被定义
  110. COMPILER4 当使用 Delphi 4 或 C++Builder 4 编译时该指令被定义
  111. COMPILER5 当使用 Delphi 5 或 C++Builder 5 编译时该指令被定义
  112. COMPILER6 当使用 Delphi 6 或 C++Builder 6 编译时该指令被定义
  113. COMPILER7 当使用 Delphi 7 或 C++Builder 7 编译时该指令被定义
  114. COMPILER1_UP 当使用 Delphi 1 或更高版本的编译器编译时该指令被定义
  115. COMPILER2_UP 当使用 Delphi 2 或C++Builder 1或更高版本的编译器编译时该指令被定义
  116. COMPILER3_UP 当使用 Delphi 3 或更高版本的编译器编译时该指令被定义
  117. COMPILER35_UP 当使用 C++Builder 3 或更高版本的编译器编译时该指令被定义
  118. COMPILER4_UP 当使用 Delphi 4 或C++Builder 4或更高版本的编译器编译时该指令被定义
  119. COMPILER5_UP 当使用 Delphi 5 或C++Builder 5或更高版本的编译器编译时该指令被定义
  120. COMPILER6_UP 当使用 Delphi 6 或C++Builder 6或更高版本的编译器编译时该指令被定义
  121. COMPILER7_UP 当使用 Delphi 7 或C++Builder 7或更高版本的编译器编译时该指令被定义
  122. 六、功能指令
  123. 这些功能指令可以用来测试是否编译器支持指定的功能,例如,方法重载等,然后调整相应的代码。
  124. 指令 说明
  125. ------------------------------------------------------------------------------
  126. SUPPORTS_WIDESTRING 编译器支持 WideString 类型 (D3/BCB3 up)
  127. SUPPORTS_INTERFACE 编译器支持 interfaces 类型(D3/BCB3)
  128. SUPPORTS_EXTSYM 编译器支持 $EXTERNALSYM 指令 (D4/BCB3)
  129. SUPPORTS_NODEFINE 编译器支持 $NODEFINE 指令 (D4/BCB3)
  130. SUPPORTS_INT64 编译器支持 Int64 类型 (D4/BCB4)
  131. SUPPORTS_DYNAMICARRAYS 编译器支持动态数组(dynamic arrays) (D4/BCB4)
  132. SUPPORTS_DEFAULTPARAMS 编译器支持默认参数(default parameters) (D4/BCB4)
  133. SUPPORTS_OVERLOAD 编译器支持重载 overloading (D4/BCB4)
  134. SUPPORTS_ENUMVALUES 编译器支持 enum values (D6/KYLIX) [Added by Riceball]
  135. SUPPORTS_VARIANTS 编译器支持用户自定义变体类型 Variants user-installable types. (D6/KYLIX) [Added by Riceball]
  136. SUPPORTS_IFDIRECTIVE 编译器支持 $IF 指令. (D6/KYLIX) [Added by Riceball]