《Delphi下深入Windows核心编程》(附录A Delphi编译指令说明)
Delphi快速高小的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情况下不需要干涉编译器的运行,但是有
时也需要对编译器进行必要的设置。
**********************************************************************************************
A.1 使用编译设置对话框
编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->[Complier]选项页进行设置,绝大部分
的编译环境都可以通过这一对话框进行调整,他包含了对代码、语法、调试信息等的设置。
1.代码设置(Code Generation)
Optimization: 代码优化开关
Aligned record fields: 字对齐数据。这个编译指令能够在变量和类型化常量的字节对齐和字对齐之间进行切换,其作用是全局的。
Stack frames: Windows 堆栈帧。其作用域是局部的,他使编译器成为远端过程和函数生成特定的开头和结尾代码。这个指令用于Windows 3.0
的实模式,对所有Delphi应用程序他应该是关闭的。
Pentium-safe FDIV: Pentium安全FDIV检查。此指令能够在Pentium处理器中指定编译器是否创建能够检测和使用有缺陷的浮点除法指令的代码
。
2.运行期错误(Runtime Errors)
Range Checking: 范围检查。这个指令的作用范围是局部的,用于控制范围检验代码的生成。
I/O Checking: I/O检查。这个指令的作用域为局部,用来生成对一个文件的输入和输出过程和调用结果进行检查的代码。一般应该使其功能打
开。
Overflos Checking: 溢出检查。其作用是生成对算术溢出检查的代码。
3.语法设置(Syntax Optings)
Strict Var- strings: 静态变量串开关。用来控制对以变量参数形式传递的串的类型检查。
Comlete Boolean Eval: 完全布尔表达量判定。用于执行强制的完整表达式判定。完全布尔量判定,有可能导致系统崩溃,所以一般不使用他
。
Extended Syntax: 扩展语法开关。他能允许或禁止Delphi的扩展语法。
Typed @ Operator: 类型化的@运算符检查。应用于局部的变量引用上,控制@运算符返回的指针值类型。
Open Parameters: 开放参数开关。用于控制使用String关键字声明的变量参数。开放参数允许将大小不一的串变量传递到同一个过程或函数中
,一般在汇编中会使用到。
Huge Strings: 字符串类型开关。用于控制Ansistring和Shortstring类型的切换。当打开时符合Ansistring,关闭时符合Shortstring。
Assignable Typed Constants: 可分配类型常量。用于向下与Delphi 1.0兼容。
4.调试(Debugging)
Debug Information: 调试信息开关。用于设置是否把调试信息写入以编译的单元文件(.dcu)。
Local Symbols: 局部符号开关。允许或禁止局部符号信息的创建。
Reference Info/Definitions Only: 符号信息开关。用于允许或禁止由Delohi的对象浏览器使用的符号引用信息的生成。
Assertions: 用于控制局部代码的属性。
Use Debug DCUs: 使用或禁止VCL的DCU文件调试。
5.信息(Messages)
Show Hints: 显示暗示。
Show Warnings: 显示警告。
**********************************************************************************************
A.2 使用编译指令
除了使用编译设置对话框对编译器进行设置外,还可以通过编译指令来对编译器进行设置。
对于局部的编译器设置,只有使用编译指令来完成。
对于开关编译指令,通过在编译指令后加入指示开关状态的加号和减号来控制编译器。例如:
{$B+} : 打开完全布尔量检查。
{$Q-} : 关闭溢出检查。
通常,编译指令的作用域是在编译指令后的代码部分,而对于全程的编译指令应该防在单元接口部分的开头。
编译设置对话框的设置都有与之对应的编译指令用于在代码中对编译器进行设置,如下表所示。
设置项 编译指令
Optimizations {$O}
Aligned record fields {$A}
Stack frames {$W}
Pentium-safe FDIV {$U}
Range Checking {$R}
I/O Checking {$I}
Overflow Checking {$Q}
Strict Var-strings {$V}
Comlete Boolean Eval {$B}
Extended Syntax {$X}
Typed @ Operator {$T}
Open Parameters {$P}
Huge Strings {$H}
Assertions typed constants {$J}
Debug information {$D}
Local sysnbols {$L}
在这些编译指令以外还有一些非常有用的编译指令。
$R Filename : 这个编译指令是最为常用的编译指令,他是资源文件编译指令,用于指定连接到执行文件和库的资源文件,例如在工程文件
(.dpr)中会有{$R *.RES}的编译指令,表明把后缀为 .RES的与工程文件同名的资源文件连接入执行文件,也可以指定一个资源文件,资源文件
的使用对于编写Windows程序来说是很重要的基础。
$I Filename :这个编译指令功能类似于C语言的#Include , 用于指定编译时包括的文件。
**********************************************************************************************
A.3 使用条件编译指令
条件编译指令是非常重要的编译指令,他控制着在不同条件下(例如,不同的操作系统)产生不同的代码。条件编译指令是包含在
注释括号之内的,如下表所示。
条件编译指令 含义
$DEFINE 用于定义一个条件符号,一旦定义,条件符号就为真
$ELSE 与$IFDEF配合使用,如果$IFDEF条件为假,则只对源文件$ELSE后一小部分进行编译
$ENDIF 结束一个以$IF开始的条件段
$IFDEF 对条件符号进行判断,为真则编译源文件
$IFNDEF 对条件符号进行判断,为假则编译源文件
$IFOPT 根据编译开关状态,对源文件编译
$UNDEF 撤消以前的条件符号定义
这些条件编译指令是非常有用的。例如,可以通过开关的状态来控制编译:
{IFOPT R+}
showmessage('Compiled with range-checking');
{$ENDIF}
也可以通过定义条件符号来控制编译:
{$Define s}
……
{$ifdef s}
showmessage('yes');
{$else}
showmessage('no');
{$endif}
他的编译结果是显示'yes',但是如果省去{$Define s}则显示'no'。
在Delphi中已经预定义了一些关键的条件符号,如下表所示。
条件符号 含义
VERxx 编译器版本,XX表示版本,例如:Delphi 1.0 的编译器版本为80、Delphi 5.0 的编译器版本为130
WIN32 是否WIN32的运行环境(Windows 95.98/NT/2000)
CPU386 是否Intel386以上的处理器
CONSOLE 是否控制台程序
Delphi的编译器指令除了以上的指令外还有一些,不过最为常用的指令已经全部介绍完了。对于普通的程序,Delphi是不需要编程者去添加编
译器指令的,Delphi已经自动完成,但是要得到高品质的应用程序或者有特殊的要求的程序就必须熟悉Delphi的编译指令。Delphi不仅有最快
的编译器而且编译器的功能也非常强大。
**********************************************************************************************
简单例子:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FCaption: string;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
//用到文件 VersionDefinition.inc
{$I VersionDefinition.inc} 或 {$DEFINE AAA} // 定义行
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FCaption := 'Other';
{$IFDEF AAA}
FCaption := 'AAA';
{$ENDIF}
{$IFDEF BBB}
FCaption := 'BBB';
{$ENDIF}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := FCaption;
end;
end.
**************************
文件VersionDefinition.inc内容
//////////////////////////
{$DEFINE AAA}
{..$DEFINE BBB}
-------------------------------------------
1.编译后运行,按下Button,则看到窗体标题栏显示“AAA”。程序编译了FCaption := ’AAA’的语句。
2.改变定义行的程序段:
当改为{$DEFINE BBB}时,再次编译运行,则看到窗体标题栏显示“BBB”。程序编译了FCaption := ’BBB’的语句。当取消定义行或改为{$DEFINE NOTHING}或其他名称时,再次编译运行,则看到窗体标题栏显示“Other”。程序只编译了FCaption := ’Other’的语句。
http://blog.csdn.net/yanjiaye520/article/details/8092139
Delphi 预编译指令的更多相关文章
-
Delphi 预编译指令 的用法
A.3 使用条件编译指令条件编译指令是非常重要的编译指令,他控制着在不同条件下(例如,不同的操作系统)产生不同的代码.条件编译指令是包含在注释括号之内的,如下表所示. ...
-
Delphi中预编译指令
本文转自 http://www.cnblogs.com/JackSun/archive/2010/12/20/1911250.html <Delphi下深入Windows核心编程>(附录A ...
-
iOS中的预编译指令的初步探究
目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...
-
C/C++中的预编译指令
工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...
-
C#预编译指令
近日工作涉及到于外部系统交互,对方提供接口:但是在双方系统未联调时,引用外部DLL,相关类实例化,提示异常错误(错误消息正常):后面操作无法进行,那如何写调试代码,即在调试时不运行某段代码,而在正式发 ...
-
C:预编译指令
预编译 关于编译 参考 关于宏定义 参考 预编译又称为预处理,是做些代码文本的替换工作处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预 ...
-
C#中的预编译指令介绍
原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...
-
C++ 内置宏定义 与 预编译指令
内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE ...
-
c语言中条件编译相关的预编译指令
一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...
随机推荐
-
adb 的使用
打出log:adb logcat -s fliterName ps:(fliterName就是你的tag)
-
基于云计算Iaas平台的ZStack
2015年4月,一家全新的基础架构即服务的软件产品ZStack面世.ZStack的主创人员是自在海外云计算公司的中国人.ZStack是基于Java语言,结合了OpenStack和CloudStack上 ...
-
Linux及安全课程——相关链接总结
附录:学习笔记链接总结 MOOC课程学习笔记与实验: 第一周:计算机是如何工作的 第二周:操作系统是怎么工作的 -- 一个简单的时间片轮转多道程序内核代码及分析 第三周:构造一个简单的Linux系统M ...
-
emoji处理方法汇总
emoji资料 今天研究了emoji,挺有意思,资料挺多,摘要一些信息给大家分享,也算是自己记录学习. emoji介绍 Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是 ...
-
CentOS7修改网卡为eth0
CentOS7修改网卡为eth0 1.编辑网卡信息 [root@linux-node2~]# cd /etc/sysconfig/network-scripts/ #进入网卡目录 [root@lin ...
-
BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ...
-
HDU 1069 monkey an banana DP LIS
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription 一组研究人员正在 ...
-
plink合并文件并更新SNP位置(merge file, update SNP position)
一.合并文件 plink合并文件需要用到“merge”参数 如果是ped和map格式文件,则用以下命令: plink --file data1 --merge data2.ped data2.map ...
-
017 jquery中对样式的操作
1.样式操作 2.css-dom操作 3.程序 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
-
android中 检查网络连接状态的变化,无网络时跳转到设置界面
1:在AndroidManifest.xml中加一个声明 <receiver android:name="NetCheckReceiver"> <inten ...