2019独角兽企业重金招聘Python工程师标准>>>

一个程序从无到有的过程是这样的: 编辑代码 -> 预处理 -> 编译(成dcu等) -> 链接(为exe等).

什么是预处理?
譬如 VCL 中有很多代码是兼容 Linux 的, 在 Windows 下就需要在编译之前预处理掉那些 for Linux 的代码.


1、判断操作系统:


其中的 "MSWINDOWS" 和 "LINUX" 就是 Delphi 预定义的 "条件标识符".


begin  {$IFDEF MSWINDOWS}    ShowMessage('Windows');{$ENDIF}  {$IFDEF LINUX}    ShowMessage('Linux');{$ENDIF}end;

2、自定义条件标识符(DEFINE):


下面例子中自定义了条件标识符: WanYi; 标识符和定义它的指令都不区分大小写, 但大家一般惯用大写.


begin  {$DEFINE WANYI}  {$IFDEF WanYi}    ShowMessage('标识符 WanYi 已定义');{$ELSE}    ShowMessage('标识符 WanYi 未定义');{$ENDIF}end;

3、取消条件标识符的定义(UNDEF):


begin  {$DEFINE WANYI}  {$IFDEF WANYI}     ShowMessage('确认标识符 WanYi 是否定义');{$ENDIF}  {$UNDEF WANYI}  {$IFDEF WANYI}     ShowMessage('再次确认标识符 WanYi 是否定义');{$ENDIF}end;

4、取消定义的简单办法:


在 {$...} 的 $ 前面随便加点什么, 让它变成 "注释", 譬如: {.$}


begin  {.$DEFINE WANYI}  {$IFDEF WANYI}     ShowMessage('确认标识符 WanYi 是否定义');{$ENDIF}  {.$UNDEF WANYI}  {$IFDEF WANYI}     ShowMessage('再次确认标识符 WanYi 是否定义');{$ENDIF}end;

5、调试编译指令时特别要注意的:


Delphi 有个常识: 如果单元代码没有改变, 相应的 dcu 不会重新生成!

因此, 为了有准确的调试结果, 执行前先用 Shift+F9 强制编译当前工程, 然后再 Run;
强制编译所有相关单元也可以, 方法: Project -> Build all project.

当然修改下代码也很方便, 譬如在代码中打个空格再退回来.


6、测试预定义的 Debug 和 Release:


当我们当新建一个工程, Delphi 默认的是调试(Debug)状态, 当我们发布软件时应该切换到发布(Release)状态.
两种状态下编译指令是有区别的, 在 Release 状态下发布的 dcu 或 exe 会更小、更优化.

Debug 和 Release 的切换方法:
进入 Project Manager -> Build Configurations, 在 Debug 或 Release 上双击, 或从右键 Activate.

下面的代码可以检测到这种改变, 不过要注意上面提到的 Shift+F9 或 Project -> Build all project.


begin  {$IFDEF DEBUG}    ShowMessage('调试模式');{$ENDIF}  {$IFDEF RELEASE}    ShowMessage('发布模式');{$ENDIF}end;

7、编译指令写在哪?:


编译指令可以写在代码页的任何地方, 不过在代码的不同区域有时也会不同;

譬如: {$APPTYPE GUI} 和 {$APPTYPE CONSOLE} 就只能写在工程文件里才有效.

{$APPTYPE GUI} 和 {$APPTYPE CONSOLE} 分别表示窗口工程和控制台工程.
其中 {$APPTYPE GUI} 是默认的, 所以很少见到它.

它甚至可以嵌入到代码行当中, 譬如 ActnColorMaps 单元就有这么一句:


begin  SystemParametersInfo(SPI_GETFLATMENU, 0, {$IFNDEF CLR}@{$ENDIF}FlatMenus, 0);end;

8、条件标识符的有效范围:


Delphi 预定义的条件标识符都是全局的, 我们用 {$DEFINE ...} 自定义的标识符都是局部的.

如何自定义全局的标识符呢?
Project -> Options... -> 选定 Delphi Compiler -> 点击 Conditional defines 右边小按钮 -> 添加.

不过这和系统预定义的还是有区别, 咱们自定义的只能用于当前文件.

如何定义每个文件都可以使用的标识符呢?
从 Project -> Options... 定义后, 马上选择左下角的 Default.

这和系统预定义的还是有区别, 因为这只能左右以后的文件, 管不着以前存在的文件.
如何...没办法了.

其他编译指令, 譬如在 Debug 或 Release 中的设置也都是这样; 也就是说: 每个文件都有相对独立的编译设置.

看到 Project -> Options... 马上明白了编译指令的设置方法有两种:
1、使用 {$...} 在代码中嵌入;
2、从 Project -> Options... 设置.

但在代码中嵌入有时是不可替代的, 譬如现在讨论的条件编译.


9、编译指令有多少?:


现在谈到的还只是条件编译, 实际应用最多的是开关编译; 在任一代码页执行快捷键 Ctrl+O+O , 然后看看最上面...

下面列出了这些默认设置:


{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N-,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}{$MINSTACKSIZE $00004000}{$MAXSTACKSIZE $00100000}{$IMAGEBASE $00400000}{$APPTYPE GUI}{$WARN SYMBOL_DEPRECATED ON}{$WARN SYMBOL_LIBRARY ON}{$WARN SYMBOL_PLATFORM ON}{$WARN SYMBOL_EXPERIMENTAL ON}{$WARN UNIT_LIBRARY ON}{$WARN UNIT_PLATFORM ON}{$WARN UNIT_DEPRECATED ON}{$WARN UNIT_EXPERIMENTAL ON}{$WARN HRESULT_COMPAT ON}{$WARN HIDING_MEMBER ON}{$WARN HIDDEN_VIRTUAL ON}{$WARN GARBAGE ON}{$WARN BOUNDS_ERROR ON}{$WARN ZERO_NIL_COMPAT ON}{$WARN STRING_CONST_TRUNCED ON}{$WARN FOR_LOOP_VAR_VARPAR ON}{$WARN TYPED_CONST_VARPAR ON}{$WARN ASG_TO_TYPED_CONST ON}{$WARN CASE_LABEL_RANGE ON}{$WARN FOR_VARIABLE ON}{$WARN CONSTRUCTING_ABSTRACT ON}{$WARN COMPARISON_FALSE ON}{$WARN COMPARISON_TRUE ON}{$WARN COMPARING_SIGNED_UNSIGNED ON}{$WARN COMBINING_SIGNED_UNSIGNED ON}{$WARN UNSUPPORTED_CONSTRUCT ON}{$WARN FILE_OPEN ON}{$WARN FILE_OPEN_UNITSRC ON}{$WARN BAD_GLOBAL_SYMBOL ON}{$WARN DUPLICATE_CTOR_DTOR ON}{$WARN INVALID_DIRECTIVE ON}{$WARN PACKAGE_NO_LINK ON}{$WARN PACKAGED_THREADVAR ON}{$WARN IMPLICIT_IMPORT ON}{$WARN HPPEMIT_IGNORED ON}{$WARN NO_RETVAL ON}{$WARN USE_BEFORE_DEF ON}{$WARN FOR_LOOP_VAR_UNDEF ON}{$WARN UNIT_NAME_MISMATCH ON}{$WARN NO_CFG_FILE_FOUND ON}{$WARN IMPLICIT_VARIANTS ON}{$WARN UNICODE_TO_LOCALE ON}{$WARN LOCALE_TO_UNICODE ON}{$WARN IMAGEBASE_MULTIPLE ON}{$WARN SUSPICIOUS_TYPECAST ON}{$WARN PRIVATE_PROPACCESSOR ON}{$WARN UNSAFE_TYPE OFF}{$WARN UNSAFE_CODE OFF}{$WARN UNSAFE_CAST OFF}{$WARN OPTION_TRUNCATED ON}{$WARN WIDECHAR_REDUCED ON}{$WARN DUPLICATES_IGNORED ON}{$WARN UNIT_INIT_SEQ ON}{$WARN LOCAL_PINVOKE ON}{$WARN MESSAGE_DIRECTIVE ON}{$WARN TYPEINFO_IMPLICITLY_ADDED ON}{$WARN RLINK_WARNING ON}{$WARN IMPLICIT_STRING_CAST ON}{$WARN IMPLICIT_STRING_CAST_LOSS ON}{$WARN EXPLICIT_STRING_CAST OFF}{$WARN EXPLICIT_STRING_CAST_LOSS OFF}{$WARN CVT_WCHAR_TO_ACHAR OFF}{$WARN CVT_NARROWING_STRING_LOST OFF}{$WARN CVT_ACHAR_TO_WCHAR OFF}{$WARN CVT_WIDENING_STRING_LOST OFF}{$WARN XML_WHITESPACE_NOT_ALLOWED ON}{$WARN XML_UNKNOWN_ENTITY ON}{$WARN XML_INVALID_NAME_START ON}{$WARN XML_INVALID_NAME ON}{$WARN XML_EXPECTED_CHARACTER ON}{$WARN XML_CREF_NO_RESOLVE ON}{$WARN XML_NO_PARM ON}{$WARN XML_NO_MATCHING_PARM ON}

转载于:https://my.oschina.net/u/566587/blog/373182

Delphi 的编译指令(1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDI相关推荐

  1. DELPHI的编译指令

    DELPHI的编译指令  可以检测到这种改变,   (1)  Shift+F9 或 Project -> Build all project.                           ...

  2. Delphi编译指令说明

    Delphi快速高小的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情况下不需要干涉编译器的运行,但是有时也需要对编译器进行必要的设置. ******** ...

  3. Delphi编译指令了解学习

    以下内容来源于网络,整理在一块儿方便以后回顾查看. Delphi 的编译指令(1) DEFINE.DEFINE.DEFINE.UNDEF.IFDEF.IFDEF.IFDEF.ELSE.$ENDIF 一 ...

  4. Delphi 编译指令与说明

    一个程序从无到有的过程是这样的: 编辑代码 -> 预处理 -> 编译(成dcu等) -> 链接(为exe等). 一.什么是预处理? 譬如 VCL 中有很多代码是兼容 Linux 的, ...

  5. Delphi 简单的编译指令

    RAD Studio 10.2.3 测试√ uCompile_ZhiLing.pas // 编译指令 unit uCompile_ZhiLing;interfaceusesSystem.SysUtil ...

  6. FPGA之道(36)Verilog中的编译指令

    文章目录 前言 Verilog中的编译指令 define指令 timescale指令 inlcude指令 前言 本文摘自<FPGA之道>,一起来了解下Verilog中的编译指令. Veri ...

  7. C#中的预编译指令介绍

    原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...

  8. verilog编译指令

    编译指令 以`(反引号)开始的某些标识符是编译器指令.在Verilog 语言编译时,特定的编译器指令在整个编译过程中有效(编译过程可跨越多个文件),直到遇到其它的不同编译程序指令.完整的标准编译器指令 ...

  9. jsp 4种常用语法3个编译指令7个动作指令

    4种常用语法: 注释:<%--注释--%> 声明:<%!声明部分%> 输出:<%=%> 脚本:可以包含任何java可执行代码.例 <% for(int i=0 ...

最新文章

  1. 关于C#的强制转换和尝试转换的方法
  2. AndroidStudio安卓原生开发_打包apk安装文件---Android原生开发工作笔记130
  3. 集成Jupyter notebook的工具或平台
  4. linux进入uvc目录,Linux uvc驱动分析
  5. nyoj35 表达式求值
  6. 有效利用ASP.NET用户控件的事件委托
  7. z变换解差分方程例题_中级数学4 - 多元线性方程
  8. Jersey MongoDB的使用
  9. Referenced file contains errors解决
  10. 强智教务系统验证码识别 Tensorflow CNN
  11. 树形结构的处理——组合模式(二)
  12. poi3.17版本生成excel文件时,单元格生成求和公式
  13. 一个进入大厂的人对产品的感悟--转载
  14. 极光开发者周刊【No.0423】
  15. python datetime 计算两个日期之间的天数差
  16. Echarts使用总结(一)
  17. java冒险游戏_Java冒险小游戏
  18. 蓝牙官方资料下载地址(官方)
  19. 大掌门手游外挂(大掌门代练助手)
  20. 让程序员蛋疼的那些事儿

热门文章

  1. 微信小程序开发登录界面mysql_微信小程序 欢迎界面开发的实例详解
  2. SPI的原理以及Verilog HDL实现
  3. Virtex-6系列FPGA的CLB
  4. 小程序页面跳转传参参数值为url时参数时 会出现丢失
  5. 【初阶】unity3d官方案例_太空射击SpacingShooter 学习笔记 显示分数时,如何让函数之间相互交流...
  6. 细说Asp.net的IP地址屏蔽功能设计
  7. 安装 SQL Server 商业解决方案模板
  8. MySQL alter
  9. Oracle SQL 空值排序(Nulls)
  10. c#初学-索引器get和set的使用(泛型类)