做网站哪个平台好一点,网站设计模板图,爱站网长尾挖掘工具,网站技术实现方案原文
2.109.0带来了15个主要更改和26个修复的Bugzilla问题.非常感谢39位贡献者,是他们使2.109.0变成可能.
更改编译器
1,[下一版]现在,为类型实例的成员设置别名是个错误 2,添加位字段内省功能 3,添加了从CTFE写入消息的__ctfeWrite 4,现在-verrors也限制弃用警告 5,dtoh为e…原文
2.109.0带来了15个主要更改和26个修复的Bugzilla问题.非常感谢39位贡献者,是他们使2.109.0变成可能.
更改编译器
1,[下一版]现在,为类型实例的成员设置别名是个错误 2,添加位字段内省功能 3,添加了从CTFE写入消息的__ctfeWrite 4,现在-verrors也限制弃用警告 5,dtoh为extern(Windows)和extern(System)函数生成签名. 6,动态数组上的每一可有小于size_t的索引类型 7,在闭包上每一逆现在是个错误 8,添加了标识表的扩展以允许新符匹配C23及CLI可配置性 9,ImportC改进了统一支持 10,缺少符号错误不再神秘 11,已删除窗口的OMF支持
更改运行时
1,添加core.sys.linux.sys.mount模块. 2,从d运行时中删除了所有collectNoStack函数和API. 3,按trusted标记Thread.sleep
更改库
1,添加std.process.Config.preExecDelegate
更改编译器
[下一版]现在,为类型实例的成员设置别名是个错误
此别名实际上是实例类型的成员的别名,而不是实例成员自身的别名.会很怪,现在是一个错误.相反,请为以下类型的成员设置别名:
struct Foo
{int v;void test(Foo that) const{alias a this.v;//好alias b that.v;//错误,请改用typeof(that).vassert(a is b);//通过assert(b !is that.v);}
}
struct Bar
{Foo f;alias v f.v;//错误,请使用typeof(f).v
}添加位字段内省功能
增加: 1,.bitoffsetOf属性取位域的开始位号. 2,.bitwidth属性取位域中的位数. 3,如果字段元素是位域,则__traits(isBitfield,symbol),返回真
添加了从CTFE写入消息的__ctfeWrite
类似pragma(msg,...),__ctfeWrite特殊函数,现在可用来在CTFE时写入消息.实现定义如何给用户渲染消息; 推荐方法是打印消息到stderr标准错误流.该函数在object.d中可用,并接受隐式按const(char)[]转换任意值. 如:
int greeting()
{__ctfeWrite(Hello from CTFE. Today is );__ctfeWrite(__DATE__);__ctfeWrite(\n);return 0;
}
enum forceCTFE greeting();编译此程序生成以下输出: 来自CTFE的你好.今天是当前日期现在-verrors也限制弃用警告
默认,编译器会在20条错误消息后停止,除非传递-verrors50或-verrors0(不限制)来指定不同的数. 此错误限制现在也适合弃用消息,因此在编译尚未修复所有弃用的大项目时,命令行不会被数百个弃用消息淹没.
deprecated void f()
{
}
void main()
{f();f();f();f();
}dmd verrors3 app.dapp.d(7):废弃:已弃用app.f函数 app.d(8):废弃:已弃用app.f函数 app.d(9):废弃:已弃用app.f函数 省略了1个弃用警告,使用-verrors0显示所有.
dtoh为extern(Windows)和extern(System)函数生成签名.
使用-HC开关时,除了extern(C)和extern(C)函数外,extern(Windows)和extern(System)函数也会输出到.h文件中. 示例D模块:
extern(Windows) int hello()
{return 0;
}
extern(System) int myFriend()
{return 0;
}用-HC开关:
//省略了完整头
#ifndef _WIN32
#define EXTERN_SYSTEM_AFTER __stdcall
#define EXTERN_SYSTEM_BEFORE
#else
#define EXTERN_SYSTEM_AFTER
#define EXTERN_SYSTEM_BEFORE extern C
#endif
int32_t __stdcall hello();
EXTERN_SYSTEM_BEFORE int32_t EXTERN_SYSTEM_AFTER myFriend(x);动态数组上的每一可有小于size_t的索引类型
对以下情况,在编译时数组长度是已知的: 1,数组是一个文本. 2,该数组是在编译时已知其上限的一个切片式. 3,对a数组,索引类型可以是I整数类型,其中a.lengthI.max. 4,尚未实现其他情况.
在闭包上每一逆现在是一个错误
使用每一逆时,编译器不会试反向遍历闭包返回的结果.这会导致难以阅读的代码,因此,(多年来)已弃用. 现在,闭包上用每一逆是个错误.
添加了标识表的扩展以允许新符匹配C23及CLI可配置性
当前,可对D和ImportC,在c99,c11,UAX31(C23)和all(最少限制集)间选择. 这可通过-identifierstable和对ImportC用-identifiers-importctable来完成.
当前按all设置D的默认表,而按c11设置ImportC.以前,D和ImportC都使用c99表. 稍后D的表会切换到UAX31,这应该在2.117中完成.如果你此时正在使用c99指定符,且不愿意更改它们,可切换回all.
ImportC改进了统一支持
现在支持通用符名,允许按标识的一部分使用\uXXXX和\UXXXXXXXX语法,其中X是十六进制数字. DigitalMars的sppn不支持C99以上的更新版本.已知它是有限的,使用不在这些区间内的统一符都会导致错误.
缺少符号错误不再神秘
经常忘记链接库,在命令行上列举.d文件或包含主函数.例:
module app;
unittest
{import assertions;assertEquals(D, D);
}
module assertions;
void assertEquals(char a, char b)
{assert(a b);
}如下编译时: dmd unittest app.d编译器不会看到错误,但在链接时缺少符号.以前,这会导致一个带混杂符号名的神秘的链接器错误,错误略. 现在,当编译器调用链接器程序时,它读取其输出,扫描未定义的符号错误,并解混杂名字: 错误:未定义主 错误:未定义void assertions.assertEquals(char,char)引用 引用自void app.__unittest_L5_C1() 也许可定义一个void main(){}函数,或使用-main开关 也许需要在命令行中添加.d文件,或使用-i编译导入 错误:链接器退出,状态为1
这样可更轻松地修复命令: dmd -unittest -main -i app.d当前支持的链接器包括ld,bfd,gold,mold和MicrosoftLINK.如果未检测到链接器的错误,请提交问题.
已删除窗口的OMF支持
在窗口上,支持默认设置PECOFF两年后,现在不再支持OMF. 这包括开关(-m32omf).
更改运行时
添加core.sys.linux.sys.mount模块.
core.sys.linux.sys.mount新模块,提供了与Linux上的sys/mount.h头文件中的对应的定义.
从d运行时中删除所有collectNoStack函数和API.
按trusted标记Thread.sleep
现在按trusted标记core.thread.Thread.sleep静态方法,可直接从安全代码中调用它.
更改库
添加std.process.Config.preExecDelegate
std.process.Config.preExecDelegate与std.process.Config.preExecFunction类似,但可抓环境,如:
import core.sys.linux.sys.prctl : PR_SET_PDEATHSIG, prctl;
import std.process : Config, execute;
void runProgram(int pdeathsig)
{execute([program],config: Config(preExecDelegate: () trusted prctl(PR_SET_PDEATHSIG, pdeathsig, 0, 0, 0) ! -1,),);
}preExecFunction为兼容而保留,如果同时给出了preExecFunction和preExecDelegate,则会调用两者.