| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- 如何使用编译开关建立可移植的代码
- 作者:Riceball(riceball@cq118.com or riceballl@hotmail.com)
- Date: 2002-3-3
- 更新:周劲羽(zjy@cnpack.org) 增加对 Delphi/BCB 7 的说明
- Data: 2002-9-10
- 难度:中
- 我们使用编译开关可以帮助我们在同一文件中适应不同版本的Delphi(Pascal)编译器,同时支持多个版本的编译器。下面是不同版本的编译器的条件定义列表。
- 不同版本编译器的条件定义:
- _____________________________
- 版本 条件定义指令
- Delphi 1 VER80
- Delphi 2 VER90
- C++Builder 1 VER93
- Delphi 3 VER100
- C++Builder 3 VER110
- Delphi 4 VER120
- C++Builder 4 VER125
- Delphi 5 VER130
- C++Builder 5 VER130
- Kylix 1 VER140
- Delphi 6 VER140
- C++Builder 6 VER140
- Delphi 7 VER150
- C++Builder 7 VER150
- 尽管大多数的Delphi代码在不同版本中编译是完全没有问题的,但是依然有少数代码需要在不同的编译器下作稍许的修改,使用编译开关你就可以在同一文件中支持多个版本,象这样:
- {$IFDEF VER80}
- Delphi 1 code goes here
- {$ENDIF}
- {$IFDEF VER90}
- Delphi 2 code goes here
- {$ENDIF}
- {$IFDEF VER93}
- C++Builder 1 code goes here
- {$ENDIF}
- {$IFDEF VER100}
- Delphi 3 code goes here
- {$ENDIF}
- {$IFDEF VER110}
- C++Builder 3 code goes here
- {$ENDIF}
- {$IFDEF VER120}
- Delphi 4 and C++Builder 4 code goes here
- {$ENDIF}
- {$IFDEF VER130}
- Delphi and C++Builder 5 code goes here
- {$ENDIF}
- {$IFDEF VER140}
- Delphi 6 and Kylix code goes here
- {$ENDIF}
- {$IFDEF VER150}
- Delphi 7 and Kylix code goes here
- {$ENDIF}
- 不过,这并不是一个完整的漂亮的解决方案--看着这些VERxxx,你会觉得如同在读天书。Delphi的每一次的版本变化,功能都有所不同,如:在Delphi3以上的版本中增加对Interface的支持,在Delphi4以上的版本增加了对动态数组的支持等等。
- 在这里提供两个包含文件,供你参考。一个是Jedi.inc文件,它提供了关于编译器的信息以及所支持的功能的条件编译信息。另一个是Setting.inc文件,它将Jedi.inc链接了进来,并设置了程序所需要的参数开关, 你可以根据项目的需要进行更改。
- Jedi.inc 提供了如下的条件定义指令:
- 一、开发环境指令
- 指令 说明
- ------------------------------------------------------------------------------
- DELPHI 当使用 Delphi 编译时该指令被定义
- BCB 当使用 C++Builder 编译时该指令被定义
- 二、操作平台指令
- 指令 说明
- ------------------------------------------------------------------------------
- MSWINDOWS 当目标平台是 MS Windows [Added By Riceball]
- WIN16 当目标平台是 16位 Windows [Added By Riceball]
- WIN32 当目标平台是 32位 Windows
- LINUX 当目标平台是 Linux
- 三、Delphi版本指令
- 将 VerXXX 指令映射成容易记住的Delphi版本名称。
- 指令 说明
- ------------------------------------------------------------------------------
- DELPHI1 当使用 Delphi 1 编译时该指令被定义
- DELPHI2 当使用 Delphi 2 编译时该指令被定义
- DELPHI3 当使用 Delphi 3 编译时该指令被定义
- DELPHI4 当使用 Delphi 4 编译时该指令被定义
- DELPHI5 当使用 Delphi 5 编译时该指令被定义
- DELPHI6 当使用 Delphi 6 编译时该指令被定义
- DELPHI7 当使用 Delphi 7 编译时该指令被定义
- DELPHI1_UP 当使用 Delphi 1 或更高版本的编译器编译时该指令被定义
- DELPHI2_UP 当使用 Delphi 2 或更高版本的编译器编译时该指令被定义
- DELPHI3_UP 当使用 Delphi 3 或更高版本的编译器编译时该指令被定义
- DELPHI4_UP 当使用 Delphi 4 或更高版本的编译器编译时该指令被定义
- DELPHI5_UP 当使用 Delphi 5 或更高版本的编译器编译时该指令被定义
- DELPHI6_UP 当使用 Delphi 6 或更高版本的编译器编译时该指令被定义
- DELPHI7_UP 当使用 Delphi 7 或更高版本的编译器编译时该指令被定义
- 四、C++Builder 版本指令
- 将 VerXXX 指令映射成容易记住的C++Builder版本名称。
- 指令 说明
- ------------------------------------------------------------------------------
- BCB1 当使用 C++Builder 1 编译时该指令被定义
- BCB3 当使用 C++Builder 3 编译时该指令被定义
- BCB4 当使用 C++Builder 4 编译时该指令被定义
- BCB5 当使用 C++Builder 5 编译时该指令被定义
- BCB6 当使用 C++Builder 6 编译时该指令被定义
- BCB7 当使用 C++Builder 7 编译时该指令被定义
- BCB1_UP 当使用 C++Builder 1 或更高版本的编译器编译时该指令被定义
- BCB3_UP 当使用 C++Builder 3 或更高版本的编译器编译时该指令被定义
- BCB4_UP 当使用 C++Builder 4 或更高版本的编译器编译时该指令被定义
- BCB5_UP 当使用 C++Builder 5 或更高版本的编译器编译时该指令被定义
- BCB6_UP 当使用 C++Builder 6 或更高版本的编译器编译时该指令被定义
- BCB7_UP 当使用 C++Builder 7 或更高版本的编译器编译时该指令被定义
- 五、编译器版本指令
- 将 VerXXX 指令映射成容易记住的编译器版本名称。
- 指令 说明
- ------------------------------------------------------------------------------
- COMPILER1 当使用 Delphi 1 编译时该指令被定义
- COMPILER2 当使用 Delphi 2 或 C++Builder 1 编译时该指令被定义
- COMPILER3 当使用 Delphi 3 编译时该指令被定义
- COMPILER35 当使用 C++Builder 3 编译时该指令被定义
- COMPILER4 当使用 Delphi 4 或 C++Builder 4 编译时该指令被定义
- COMPILER5 当使用 Delphi 5 或 C++Builder 5 编译时该指令被定义
- COMPILER6 当使用 Delphi 6 或 C++Builder 6 编译时该指令被定义
- COMPILER7 当使用 Delphi 7 或 C++Builder 7 编译时该指令被定义
- COMPILER1_UP 当使用 Delphi 1 或更高版本的编译器编译时该指令被定义
- COMPILER2_UP 当使用 Delphi 2 或C++Builder 1或更高版本的编译器编译时该指令被定义
- COMPILER3_UP 当使用 Delphi 3 或更高版本的编译器编译时该指令被定义
- COMPILER35_UP 当使用 C++Builder 3 或更高版本的编译器编译时该指令被定义
- COMPILER4_UP 当使用 Delphi 4 或C++Builder 4或更高版本的编译器编译时该指令被定义
- COMPILER5_UP 当使用 Delphi 5 或C++Builder 5或更高版本的编译器编译时该指令被定义
- COMPILER6_UP 当使用 Delphi 6 或C++Builder 6或更高版本的编译器编译时该指令被定义
- COMPILER7_UP 当使用 Delphi 7 或C++Builder 7或更高版本的编译器编译时该指令被定义
- 六、功能指令
- 这些功能指令可以用来测试是否编译器支持指定的功能,例如,方法重载等,然后调整相应的代码。
- 指令 说明
- ------------------------------------------------------------------------------
- SUPPORTS_WIDESTRING 编译器支持 WideString 类型 (D3/BCB3 up)
- SUPPORTS_INTERFACE 编译器支持 interfaces 类型(D3/BCB3)
- SUPPORTS_EXTSYM 编译器支持 $EXTERNALSYM 指令 (D4/BCB3)
- SUPPORTS_NODEFINE 编译器支持 $NODEFINE 指令 (D4/BCB3)
- SUPPORTS_INT64 编译器支持 Int64 类型 (D4/BCB4)
- SUPPORTS_DYNAMICARRAYS 编译器支持动态数组(dynamic arrays) (D4/BCB4)
- SUPPORTS_DEFAULTPARAMS 编译器支持默认参数(default parameters) (D4/BCB4)
- SUPPORTS_OVERLOAD 编译器支持重载 overloading (D4/BCB4)
- SUPPORTS_ENUMVALUES 编译器支持 enum values (D6/KYLIX) [Added by Riceball]
- SUPPORTS_VARIANTS 编译器支持用户自定义变体类型 Variants user-installable types. (D6/KYLIX) [Added by Riceball]
- SUPPORTS_IFDIRECTIVE 编译器支持 $IF 指令. (D6/KYLIX) [Added by Riceball]
|