Delphi 的编译指令(3): 常用的预定义条件标识符

PCIE6.0协议学习小记-Flit_Mode PCIE6.0学习 阅读详情

版本标识:
VER10  : Turbo Pascal 1
VER20  : Turbo Pascal 2
VER30  : Turbo Pascal 3
VER40  : Turbo Pascal 4
VER50  : Turbo Pascal 5
VER60  : Turbo Pascal 6
VER70  : Turbo Pascal 7 / Borland Pascal 7
VER80  : Delphi 1
VER90  : Delphi 2
VER100 : Delphi 3
VER110 : ?
VER120 : Delphi 4
VER130 : Delphi 5
VER140 : Delphi 6
VER150 : Delphi 7
VER160 : Delphi 8
VER170 : Delphi 2005
VER180 : Delphi 2006
VER185 : Delphi 2007
VER190 : ?
VER200 : Delphi 2009

 

其他:
MSWINDOWS
WIN32
LINUX
KYLIX
CLR
VSNET
CONSOLE
DEBUG
RELEASE
PDEBUGS
UNICODE
UNICODESTRING
posted @  2009-02-26 09:09 A.wei 阅读(112) |  评论 (0) |  编辑
1. $IFDEF 等同于 $IF DEFINED(...) :
它们的结束分别是: $ENDIF、$IFEND; 例子中的 VER200 是 Delphi 2009 的标识.
begin
{$IFDEF VER200}
ShowMessage('这是 Delphi 2009');
{$ENDIF}
{$IF DEFINED(VER200)}
ShowMessage('这是 Delphi 2009');
{$IFEND}
end;

  

2. $IFNDEF 等同于 $IF NOT DEFINED(...) :
它们的结束分别是: $ENDIF、$IFEND; 例子中的 VER150 是 Delphi 7 的标识.
begin
{$IFNDEF VER150}
ShowMessage('这不是 Delphi 7');
{$ENDIF}
{$IF NOT DEFINED(VER150)}
ShowMessage('这不是 Delphi 7');
{$IFEND}
end;

  

3. 可以使用 or 和 and:
begin
{$DEFINE AAA}
{$DEFINE BBB}
{$IF DEFINED(AAA) OR DEFINED(BBB)}
ShowMessage('条件标识符 AAA 和 BBB 其中一个定义了');
{$IFEND}
{$IF DEFINED(AAA) AND DEFINED(BBB)}
ShowMessage('条件标识符 AAA 和 BBB 都定义了');
{$IFEND}
end;

  

4. 可以使用 System 单元里的常量:
我测试了 System 单元里的很多常量都没问题.
begin
ShowMessage(FloatToStr(CompilerVersion)); {在 Delphi 2009 中, CompilerVersion = 20.0}
{$IF CompilerVersion >= 17.0}
ShowMessage('这是 Delphi 2005 或以上的版本');
{$IFEND}
end;

  

5. 使用 $IFOPT 判断编译开关:
Delphi 挺好玩, 26个字母分别安排成不同的开关指令(用 Ctrl+o+o 查看, 当然开关指令不止这些);
$IFOPT 可以判断这些指令是否打开.
这个指令不是很常用, 我看了一下 2009 的 VCL 源码, 总共才用了 6 次.
begin
{$IFOPT B+}
ShowMessage('指令 B 已打开');
{$ELSE}
ShowMessage('指令 B 已关闭');
{$ENDIF}
{$B+}
{$IFOPT B+}
ShowMessage('Ok!');
{$ENDIF}
end;
posted @  2009-02-26 09:07 A.wei 阅读(142) |  评论 (0) |  编辑
一个程序从无到有的过程是这样的: 编辑代码 -> 预处理 -> 编译(成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}

变压器励磁电感、励磁电流、漏感、漏感折算 励磁、漏感知识整理 阅读详情

相关推荐

星光、黑光、全彩夜视摄像头技术解析与实战选型指南

本文深入解析了星光、黑光、全彩与红外等主流夜视摄像头技术的工作原理与核心差异。针对不同监控场景与预算,提供了实战选型指南,帮助用户在安防项目中做出明智决策,实现夜间监控效果最大化。

weixin_29179311的博客 346

Delphi预编译指令

Delphi编译指令共有三种,开关编译指令、参数编译指令和条件编译指令,下面分别讲述三种编译指令 开关编译指令 开关编译指令的特点是它有ON 、OFF两种转换状态。对于单字符版本,你可以在编译指令后添加 "+"或"-"。对于长字符版本,你可以在编译指令后添加 "ON"或"OFF"。 开关编译指令又分为全局和局部两种。全局编译指令影响全部的编译内容,它必须在放在工程或单元声明之前。局

star_of_light的专栏 1700

告别混乱接线!用EPLAN 3D布局图,手把手教你搞定电气柜的3D建模与自动布线

本文详细介绍了如何使用EPLAN 3D布局图进行电气柜的3D建模与自动布线,帮助工程师告别混乱接线。从项目准备、基础结构建模到智能设备布局与逻辑定义,再到高级布线技术与问题排查,提供了一套完整的实战指南。通过EPLAN的3D功能,显著提升设计效率与系统可靠性。

weixin_30680385的博客 339

初涉Delphi下Windows消息机制——系统预定义消息实例

  该实例使用的是windows的WM_KEYDOWN消息,当按键按下时,发出beep声音。创建一个窗口,代码部分如下:type TForm1 = class(TForm) private { Private declarations } procedure keydown(var Msg:TWMKeydown);message WM_KEYDOWN

夜色浮尘的专栏 1644

Claude Code vs Codex实战对比:哪个更适合你的Next.js项目?(含真实案例)

本文通过两个真实的Next.js项目案例,深度对比了Claude Code与Codex在UI实现和业务逻辑构建中的表现。Claude Code在代码质量、设计还原度和架构完整性方面优势明显,适合对可维护性要求高的生产级项目;而Codex则以快速响应和低成本见长,更适合原型开发或内部工具。文章提供了基于项目类型、团队能力和成本效益的详细选择策略。

weixin_29201859的博客 806

(超详细)Qt入门和配置Visual Studio的Qt环境

内容写了Qt入门,创建并编写第一个Qt程序,以及配置VS编写Qt程序的环境。(超级详细)

LY549826LY549264的博客 7678

中的枚举属性函数_Windows窗口与消息:窗口属性

图片来源:aHR0cHM6Ly95YW5kZS5yZS9wb3N0L3Nob3cvNTAxODg5(b64)什么是窗口属性窗口属性是分配给窗口的任意数据。窗口属性通常是窗口特定数据的句柄,但它也可为任何的值。每个窗口属性由一个字符串名字标识。使用窗口属性的好处窗口属性一般用来将数据与子类化的窗口联系起来,或是用在多文档界面(MDI)应用中。不论哪种情况,使用额外的窗口字节或类字节都是不太方便的,原...

weixin_32349913的博客 821

大模型训练和推理

大模型训练moe是指混合专家(Mixture-of-experts,简称MoE)的,这是一种用于提高大型神经网络性能的技术,它可以将模型的一部分替换为多个专家,每个专家只负责处理一部分输入数据,从而增加模型的参数量和表达能力,同时减少计算量和训练时间。指令可以作为模型的输入的一部分,也可以作为模型的输出的一部分,具体取决于任务的类型。上下文扩展技术的,这是一种用于提高大型语言模型(LLM)对长文本的处理能力的技术,它可以让模型在不增加参数量的情况下,扩展其注意力范围,从而提高模型的语言理解和生成能力。

weixin_45325331的博客 6019

Delphi编译指令了解学习

以下内容来源于网络,整理在一块儿方便以后回顾查看。 Delphi 的编译指令(1) DEFINE、DEFINE、DEFINE、UNDEF、IFDEF、IFDEF、IFDEF、ELSE、$ENDIF 一个程序从无到有的过程是这样的: 编辑代码 -> 预处理 -> 编译(成dcu等) -> 链接(为exe等). 什么是预处理? 譬如 VCL 中有很多代码是兼容 Linux 的, 在 ...

踏雪寻梅 1178

从“点云”到“图像”:华为896线激光雷达的技术飞跃与行业影响浅析

华为发布全球首款896线双光路激光雷达,实现车载感知从"3D点云"到"3D成像"的跨越。该产品采用创新双光路架构,集成广角和长焦单元,单帧点云量达128线产品的7倍,可在55米外识别小狗摇尾巴等细节。实测数据显示,其能识别120米外14厘米低矮障碍物,夜间低反射率目标识别距离提升190%。尽管速腾聚创随后发布更高线数产品,但华为强调实用性和量产可行性,成本仅增加1-2万元。这一突破标志着激光雷达进入大规模应用阶段,将加速高阶智驾功能普及,强化华为在智能汽车领域的技术底

致力于lidar应用开发 211

13、基因相似性度量的相关性及特征选择研究

本文研究了基因相似性度量和特征选择在生物学中的应用,详细介绍了GO术语相似性度量的多种方法,包括语义度量和路径长度度量,并分析了不同方法在酵母和人类数据集上的表现。研究发现,Avg-sum方法和基于路径长度的度量在多数情况下效果较好。此外,通过晚期辐射毒性预测的案例研究,探讨了特征选择的重要性及可能面临的过拟合和噪声干扰问题,并提出了相应的解决策略。

js777的博客 127

Delphi 的编译指令(1): $DEFINE、$UNDEF、$IFDEF、$ELSE、$ENDIF

一个程序从无到有的过程是这样的: 编辑代码 -> 预处理 -> 编译(成dcu等) -> 链接(为exe等). 什么是预处理? 譬如 VCL 中有很多代码是兼容 Linux 的, 在 Windows 下就需要在编译之前预处理掉那些 for Linux 的代码. 1、判断操作系统: 其中的 "MSWINDOWS" 和 "LINUX" 就是 Del...

145

华为OD机试双机位C卷-水库溃坝填补(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【水库溃坝填补】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。水库溃坝填补。

qq_45776114的博客 2109

Delphi 的编译指令

Delphi 的编译指令(2): 条件语句的更多用法。 摘自:http://tech.ddvip.com/2009-04/1239360887114445.html   1. $IFDEF 等同于 $IF DEFINED(...) :   它们的结束分别是: $ENDIF、$IFEND; 例子中的 VER200 是 Delphi 2009 的标识. begin{$...

aoyaxin8890的博客 196

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Delphi 编译指令的使用方法

一个程序从无到有的过程如下:  编辑代码 -> 预处理 -> 编译(成dcu等) -> 链接(为exe等).   1.编译指令原理介绍          一条编译指令实际上是一个标志符(编译器所能识别的标志符),且有其固定的语法。编译器根据不同的指令按不同的方式编译程

xiongmao000738 5439

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Delphi的编译指令

一个程序从无到有的过程是这样的: 编辑代码 -> 预处理 -> 编译(成dcu等) -> 链接(为exe等). 一、什么是预处理? 譬如 VCL 中有很多代码是兼容 Linux 的, 在 Windows 下就需要在编译之前预处理掉那些 for Linux 的代码. 1、判断操作系统: 其中的 "MSWINDOWS" 和 "LINUX" 就是 Delphi 预定义的 "条件标识符". beg

lynnelxl的专栏 1113

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 通过崩溃地址找错误行数之Delphi版
下一篇: Tapplication类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值