关于此页面
FPC 3.2.0已于2020年6月19日发布。
以下是自上一版本,以及一些背景信息和示例。
可以在以下位置找到可能破坏现有代码的更改列表用户更改3.2.
所有系统
编译器选项
默认单位范围
- 概述:添加了对单位范围(又名名称空间又名虚线单位)的支持,可以使用命令行参数提供-FN<x>.
- 笔记:
- 当编译器需要搜索单元时,它首先按原样搜索单元(首先是已编译的单元,然后是源),然后将每个提供的单元范围(按提供的顺序)前置到单元名称(用.)然后再次搜索编译后的单元,然后搜索每个单元范围的源代码。
- 该功能与-联合国选项
- 如果提供了单元范围,那么在解析属于该范围的标识符时,也可以省略它们。
- 更多信息:另请参阅公告邮件在这里
- svn公司:r38911-r38921、r38922
语言
支持与C接口阻碍功能
- 概述:增加了与接口的支持苹果的阻碍C-延长件.
- 笔记:
- 作为C阻碍与Delphi中的匿名方法非常相似,我们使用类似的语法来声明块类型(添加了cblock公司以及呼叫约定调用约定或兆帕(mwpascal)以指示C性质)。请注意,定义在块(内联,就像Delphi中的匿名方法或单独定义的函数/方法一样)和块的功能(捕获上下文和代码以在未来任意点执行它的能力)是两个不同的东西。此时(r29594),只有全局函数/过程或Object Pascal实例/类方法的代码才能在块。将来,将添加对嵌套函数的支持,稍后可能还会添加对内联定义的代码的支持,如Delphi中的代码。
- 目前只有Mac OS X 10.7(Lion)和更高版本以及iOS 4.0和更高版上的FPC支持此功能。它在Mac OS X 10.6(雪豹)和更早版本上不起作用的原因是,我们需要在更高版本中添加到块运行时的功能。
- 这个阻碍可通过以下方式在支持的平台上激活功能{$modeswitch cblocks}
- 更多信息:
- svn公司:r29517,r29594
对默认命名空间的支持
Insert()支持的动态数组
Delete()支持的动态数组
Concat()支持的动态数组
动态阵列内置+操作员支持
动态数组常量和变量初始化
动态数组构造函数
支持的更多设置$推送/$流行音乐
- 概述:指令$推送和流行音乐美元现在还可以处理指令$MinEnumSize(最小枚举大小),$套装和$打包记录.
支持苏拉瓦尔类和记录类型内的节
- 概述:类和记录类型现在可以包含threadvar类节,该节允许添加作用域threadvar变量。
- 笔记:
- 此功能与Delphi兼容
- 不包括班说明符被视为错误
- svn公司: 39285 - 39289
支持通用例程
- 概述:FPC支持泛型类型的声明,并允许成员方法访问其“父”类型多年来可能具有的任何泛型参数。在此基础上,现在可以将唯一的泛型例程(函数、过程、方法)声明为结构化类型的一部分或全局。在非Delphi语法兼容模式中,使用通用的前的关键字程序或功能关键字和专用于专门从事发出调用时,位于通用例程标识符之前的关键字。在Delphi模式下,语法遵循Delphi的语法。
- 笔记:
- 此功能与Delphi兼容,但Delphi本身不兼容不支持全局(也称为平面或独立)泛型函数或过程,仅支持泛型成员方法。然而,FPC在所有语法模式中都支持它们(包括{$mode Delphi})。
- 目前不可能在已经通用的结构化类型中声明唯一的泛型方法。这将在未来版本中更改。
- 目前不可能将指针指向泛型例程的特殊化。
- 在{$mode Delphi}中,一些涉及多个专门化的特别复杂的表达式尚不可能实现。
- 只要泛型例程的主体已经被解析,就完全支持内联。
- 示例:
单元 UTestObjFPC语法;
{$模式ObjFPC}
接口
通用的 功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;
实施
通用的 功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;
开始
结果 := 精氨酸1 + 氩气2;
结束;
结束.
程序 测试对象FPC语法;
{$mode对象FPC}{$H+}
使用
UTestObjFPC语法;
开始
Writeln公司(专门从事 添加<字符串>(“你好”, “世界”));
Writeln公司(专门从事 添加<LongInt公司>(23, 19));
结束.
单元 UTestDelphi语法;
{$模式Delphi}
接口
功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;
实施
功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;
开始
结果 := 精氨酸1 + 氩气2;
结束;
结束.
程序 测试Delphi语法;
{$mode Delphi}
使用
UTestDelphi语法;
开始
Writeln公司(添加<字符串>(“你好”, “世界”));
Writeln公司(添加<LongInt公司>(23, 19));
结束.
记录类型的管理操作员
- 概述:现在可以在记录类型中声明“管理”运算符,从而扩展其内置的初始化、终结和复制功能。新的操作员是初始化,完成,复制和添加参考号.初始化,完成和添加参考号将记录视为无功功率,无功功率-参数,同时复制运算符将源记录作为第一个参数,将目标记录作为第二个参数,其中该记录是无功功率,无功功率-参数。这个初始化和完成当此类记录分别进入或离开范围时,将调用运算符。复制将记录变量分配给另一个时调用。添加参考号当需要对现有记录的新引用时调用,例如传递旁路参数时。
- 例子:请参阅管理操作员wiki页面提供了几个代码示例,以及有关该功能的更深入信息。
接口的方法RTTI
支持helper类型扩展接口类型
- 概述:A类型帮助器现在还可以扩展接口类型。实现不是由接口实现者提供的,而是由帮助器本身提供的。
- 笔记:这允许向接口添加功能,该接口不依赖于实现者,而仅依赖于接口。
- svn公司: 37023
支持“IsManagedType”内部函数
- 概述:安IsManaged类型已添加内部函数以检查提供的类型或变量/字段是否为托管类型(当前AnsiString公司,Unicode字符串、COM接口、动态数组和管理操作员记录)。
- 笔记:此函数返回一个常量布尔值,与Delphi兼容。
- 示例:
- svn公司: 43409
支持PE/COFF元数据指令
- 概述:指令设置PEOSVersion,设置PESubSysVersion和SetPE用户版本可用于设置生成二进制文件的PE/COFF头的相应字段。格式为<MAJOR><轻微>。
- 笔记:
- 注意版本,因为这可能会导致二进制文件无法在旧版本的Windows上启动。
- 这与Delphi兼容。
- 例子:
- svn公司: 37364
支持WinAPI指令
- 概述:指令WinAPI软件可以用作例程的调用约定,以便在目标平台之外使用默认的调用约定。这相当于使用标准呼叫在Windows平台上(不过标准呼叫只对i386型)和CDecl公司在所有其他平台上。
- 笔记:
- Delphi兼容
- 尽管它是一个名字,但并不局限于Windows平台。
- svn公司: 29500
支持独特的布尔8类型
- 概述:boolean8是一个Pascal样式的布尔变量(只能包含true=1和false=0值),在参数传递约定方面,它始终与字节处理相同(与普通布尔值不同,普通布尔值遵循C/C++“bool”类型的参数传递约定)。
- 笔记:实际上,这目前只对x86-64 SYSV ABI产生影响,其中bool/boolean在寄存器的低8位中传递(其余位未定义),而boolean8被零扩展到32位(如字节和其他无符号序数类型<32位)。
单位
rtl-泛型单位
- 概述:添加了一个名为“rtl-generics”的新包。
- 笔记:此包包含与Delphi兼容的单元generics.defaults、generics.collections和其他,实现了TDictionary<>。
Rtti装置
- 概述:一个名为雷蒂已添加,它提供了对二进制文件中存储的类型信息的高级、面向对象的访问。
- 笔记:
- 该装置旨在与Delphi兼容
- 该单元目前处于实验阶段,尚未提供Delphi等效软件提供的所有功能。缺少任一类型/方法,因此编译将失败,或者调用不支持的方法将触发异常。
- 这个调用()函数以及的回调功能T方法实施由管理器提供,默认情况下未设置(EInvocationError(E位置错误)将在这种情况下提出)。当前使用利伯菲为设备所选平台提供库ffi.管理器需要在主项目文件中使用,以及不依赖于ffi.管理器单位。
处理Unicode单元
- 概述:一个名为的新单元处理Unicode已添加,它提供了TProcess的unidestring版本。这允许在Windows上进行unicode支持,而无需将默认类型设置为UTF-8。
- 笔记:
- 旧的和新的T工艺装置都进行了返工。Runcommand支持的部分现在可以在类中访问,并通过事件进行参数化。这使得自定义版本更容易。
注册表单元
- 概述:TRegistry类完全支持Unicode。
- 笔记:
- 所有使用字符串参数的公共和受保护方法(公共API)现在默认使用UnicodeString参数。
- 对于所有这些方法,都存在使用String参数的重载(这些参数称为UnicodeString对应项)。
- 使用TStrings的方法有使用TUnicodeStringArray的对应方法,ReadStringList/WriteStringList允许您指定TStrings是否应被视为UTF8编码。
- TXMLRegistry的公共API被更改为到处使用UnicodeString,而没有String重载。TXMLRegistry在内部与TXMLDocument结构进行接口,该结构使用DOMString(它反过来是WideString的别名)。
- TRegIniFile和TRegistryIniFile在非Windows平台上已被弃用。
- TRegIniFile的公共API尚未更改。
- 更多信息:https://lists.freepascal.org/pipermail/fpc-devel/2019-February/040446.html
- svn公司:r41784
CHM包
文本模式IDE
GDB/MI支持
- 概述:GDB/MI支持已添加到文本模式IDE。
- 笔记:
- 它默认启用,但可以通过使用使NOGDBMI=1
- 对于没有现代GDB端口的平台(例如,不支持真正的多任务处理,如go32v2),仍然存在旧的和弃用的libgdb.a支持。
- 在Windows中以GDB/MI模式调试控制台应用程序时,调试的程序始终在单独的控制台中运行。这是由于Windows GDB端口的限制。
- svn公司:r30573
macOS/iOS操作系统
新建iosxwstr公司单元
- 概述:新单元名为iosxwstr系统可用于在macOS和iOS上安装widestring管理器。
- 笔记:该cwstring(连续字符串)该单元实现了相同的目的,但由于苹果不再提供该单元所依赖的语言环境和代码页信息,它不再能够在iOS 7及更新版本上提供完整的功能iosxwstr系统unit从System Preferences中获取大小写转换的区域设置信息。添加两者cwstring(连续字符串)和iosxwstr系统到uses子句将导致第二行覆盖第一行的设置。
- 更多信息:将此单元添加到uses子句足以使用其功能。
- svn公司:r29828
Cocoaint单位更新
- 概述:Cocoa Interfaces已从Mac OS X 10.5更新为OS X 10.10。
- 笔记:
- 由于依赖性,CoreData和QuartzCore现在是CocoaAll部门的一部分
- NSGraphicsContext.saveGraphicsState/RestoreGraphicsState方法以前映射到具有这些名称的类方法。它们现在映射到实例方法,而相应的类方法称为classSaveGraphicsState/classRestoreGraphicsState。
- svn公司: 42500
i8086-msdos
超大内存模型
- 概述:增加了对i8086大内存模型的支持。
- 笔记:大内存模型(与大内存模型相比)消除了整个程序静态数据的64kb限制。然而,单个单元的静态数据仍有64kb的限制。
- 更多信息:超大内存模型
- svn公司:r31518
内部汇编程序(对象编写器)
- 概述:为i8086-msdos平台实现了一个内部汇编程序/对象编写器。它取代了NASM和WLIB工具。
- 笔记:由于rtl中的msdos启动代码,构建i8086-msdos快照仍然需要NASM。然而,不再需要WLIB(来自Open Watcom),因此您现在可以从没有Open Watcom工具(如DJGPP或macOS)的平台构建功能齐全的智能链接i8086-msdos快照。
- svn公司:r30809
内部链接器
- 概述:i8086-msdos平台实现了一个内部链接器。它取代了Open Watcom的WLINK。
- 笔记:内部链接器与内部汇编程序一起删除了对Open Watcom工具的依赖性。构建i8086-msdos快照仍然需要NASM,因为rtl中有msdos启动代码。
- svn公司:r31425
FarAddr内部函数
- 概述:有一个新的特定于i8086的内部函数,类似于Addr(),名为FarAdder(),它总是返回指向其参数地址的远指针。
- 笔记:内置的Addr()函数和@运算符返回指针类型(近或远),这取决于内存模型。当与DOS、BIOS和其他16位API交互时,无论选择何种内存模型,有时都可以获得指向pascal变量或过程/函数的远指针。以前,您必须使用ifdefs,或执行类似Ptr(Seg(x)、Ofs(x))的操作。现在,可以用更好的FarAddr(x)来代替它。
- svn公司:r37629
近程序变量和远程序变量
- 概述:添加了对显式指定的过程变量的支持近的或远的调用模型。
- 笔记:默认情况下,过程变量遵循当前内存模型的默认调用模型-近的在中微小的,小的和契约记忆模型;远的在中中等的,大的和巨大的模型。但是,现在可以指定显式近的或远的调用模型,与当前内存模型的默认值无关。请注意近的和远的过程变量彼此不兼容。语法非常简单:
类型TFarProc=过程(a,b:整数);远;TNearProc=过程(a,b:整数);近;
近过程变量的长度为2个字节,因此它们只包含偏移量。它们被调用时带有呼叫说明。远过程变量的长度为4个字节(16位偏移量+16位偏移),使用远呼叫。请注意,您不能仅通过填写段部分将近过程转换为远过程,因为近过程和远过程之间的调用模型也不同。远调用指令推送4字节的远(段:偏移量)返回地址,函数必须以远返回指令终止-重新整理。近调用指令仅在堆栈上推送2字节偏移量,函数必须以近返回指令终止-再制造.
i386-go32v2
添加了一个新的存档,其中包含文本模式IDE的替代版本。
- 概述:添加了一个新的存档,其中包含文本模式IDE的替代版本。
- 笔记:各种编译选项,如各种GDB选项,但不支持VESA(VESA内部版本在某些windows驱动程序中存在问题,但支持VESA有利于在纯dos下调试Graph应用程序)。存档可通过FTP获得:IDE替代版本(60MB)包含:
- svn公司:-(仅限释放建筑)
- 目录:
- 73878497 fpgdb771novesa.exe
- 74100535 fpgdb771vesa.exe文件
- 7921184 fpgdbnovesa.exe
- 22462112 fpnogdb.exe文件
- 22378419 fpnogdbnovesa.exe文件
- 4178288 fpnovesa.exe
- 3900928英尺/平方英寸
- 4240912 fpvesa.exe文件
i386-win32
i386-win32目标现在默认使用与SEH兼容的异常
- 概述:i386-win32目标现在默认使用与SEH兼容的异常。
- 笔记:这提高了与MSVC++异常处理的兼容性。
- svn公司: 43978
x86_64-win64
支持Microsoft的矢量调用约定
- 概述:在x86_64(非i386)下,通过指定矢量调用修改器。
- 笔记:比默认的Microsoft ABI更好地使用XMM寄存器,允许在类似于Linux和其他操作系统使用的System V ABI的单个寄存器中传递对齐的单数组和双数组。还允许项目与使用该约定的外部库进行交互。如果目标不是x86_64-win64,则会自动忽略“vectorcall”。
- svn公司: 38206
新编译器目标
支持AArch64目标
支持Linux/ppc64le目标
- 概述:已添加对Linux/ppc64le目标的支持。这是一个PowerPC64小端平台,它使用了一个新的ABI,称为ELFv2。
- 笔记:在big-endianLinux/ppc64目标上构建这个目标并不容易,因为构建系统还不支持处理不同的ABI/endianes。
- 更多信息:要交叉编译ppc64le编译器,请使用CROSSOPT=“-Cb--Caelfv2”。在使用本机ppcppc64在ppc64le系统上编译时,不必指定这些选项,因为默认情况下会为该编译器设置这些选项。
- svn公司:r30228
支持Android/x86_64目标
- 概述:已添加对Android/x86_64目标的支持。
- 更多信息:安卓.
- svn公司:r39956
支持i8086-win16(16位Windows)目标
- 概述:已为16位Windows目标添加了实验支持。它是一个仅限交叉编译器的目标(例如Win32、Win64或Linux可以进行交叉编译)。
- 笔记:支持Windows 3.0或更高版本。
- 更多信息:Win16系列
其他版本的新功能
Lazarus-发行说明和GIT分支及发行修复
Free Pascal编译器-用户更改(发行说明)