更改编译器
1,不推荐按断定条件
使用串字面
2,清理编译器的Makefiles
3,无法识别的编译指示
不再是错误,而是简单
忽略
4,对模块
构造器,添加了@standalone
5,已转换_d_newarray{mTX,miTX,OpT}
为单个_d_newarraymTX
模板.
更改运行时
1,清理运行时的Makefile
2,新增了用D
实现的C标准
原子头文件
更改库
1,isForwardRange
现在带可选元素类型
.
2,清理Makefile
更改编译器
不推荐按断定条件
使用串字面
可能会无意中,布尔
计算串字面
,如,当本意是assert(0,"message")
,结果却缺少0
时.
assert("unexpected runtime condition");
static assert("unhandled case for `", T, "`");
这2个
断定总是默默
地没有效果.现在,会通过弃用消息
检测到它们.如果确实需要原始行为
,请改用expr !is null
:
assert("" !is null);
static assert("" !is null);
清理编译器的Makefiles
已弃用一段时间构建
编译器的Makefile
(compiler/src/{posix,win32,win64}.mak
),并最终会删除它.
请立即
直接使用compiler/src/build.d
工具见文档,
或通过仓库
根目录中的顶级Makefile
,一步构建编译器和运行时
,如,使用LDC
主机编译器的优化构建
:
make -jN HOST_DMD=ldmd2 ENABLE_RELEASE=1 ENABLE_LTO=1
顶级Makefile
已从posix.mak
重命名为Makefile
(已弃用posix.mak
转发器).一些目标
的语义
略有变化,如,现在测试,安装和清理
目标中都包含d运行时
.
旧版src/posix.mak
文件仍存在,但会转发
到顶级Makefile
.因此,如,默认的所有目标
现在不仅是编译器,也包括druntime
.
已完全删除
顶级的win{32,64}.mak
和传统
的src/win{32,64}.mak
文件(对DigitalMars的make
).
通用的顶级Makefile
也适合带有GNU的make
(及提供bash
和GNU
工具的git
安装)的窗口
平台.
已删除
早已弃用的compiler/test/Makefile
,直接使用compiler/test/run.d
,见文档.
无法识别的编译指示
不再是错误,而是简单
忽略
以前,除非使用dmd
的-ignore
开关,无法识别的编译指示
会发出硬错误
.现在,总是忽略它们
,且忽略-ignore
开关.
对模块
构造器,添加了@standalone
当两个模块
相互导入,且都有模块构造器
时,因为无法确定先运行
哪个模块,druntime
会抛
错误.
可用pragma(crt_constructor)
来绕过
,但在C运行时
构造器中,不会初化druntime
.因此,不能在此类构造器中使用垃集器(GC)
.
@standalone
是个新属性,可用来标记在初化druntime
后运行
的,且不依赖在它之前
运行的其他
模块构造器的模块构造器
,因此不会导致循环依赖错误
.
它必须从core.attribute
导入.
编译器不会验证
模块构造器是否确实不依赖
正在初化
的其他变量
,因此必须人工确保
.因此,必须按@system
或@trusted
标记它们.
import core.attribute : standalone;
immutable int* x;
@standalone @system shared static this()
{
x = new int(10);
}
void main()
{
assert(*x == 10);
}
如果可能,最好
把有问题的模块
构造器,放入它们自己的更小模块
中,而不用@standalone
来解决循环依赖错误
.
已转换_d_newarray{mTX,miTX,OpT}
为单个_d_newarraymTX
模板.
_d_newarraymTX
模板,现在使用DBI
来检查数组中元素的类型
需要哪种类型的初化器
.因此,它替代了_d_newarraymTX
和_d_newarraymiTX
.
_d_newarrayOpT
是上述两个勾挂
的通用实现
.它首先按指针数组
分配"外部"数组
,然后调用_d_newarrayT
或_d_newarrayiT
,来相应
分配初化"内部"
的一维数组.
现在,因为已合并_d_newarraymTX
和_d_newarraymiTX
,不再需要这样做
.
现在,编译器执行以下降级操作
:
S[][] s = new S[][](2, 3)
//现在降级为:
S[] s = _d_newarraymTX!(S[][], S)([2, 3]);
此更改添加新模板
到core.internal.array.construction
.
更改运行时
清理d运行时的Makefile
{posix,win32,win64}.mak
几个Makefile
已合并到一个通用
的Makefile
(包括druntime/test/
中的Makefile
).目前按已弃用的转发器
保留posix.mak
.
在窗口
上,也可/要
借GNUmake
(及提供bash
和GNU
工具的git
安装)用通用的Makefile
.窗口
开发者终于可通过-j
利用并行性
了!
在此下载预构建的gnumake
.
用D实现C标准原子头文件
模块
目标是帮助把代码从C
移植到D语言
,并尽量提供与系统C编译器
相同的生成代码
.
如果不存在函数名的别名
,且不关心生成代码
质量,则可附加_impl
来取实现.
如果给定函数
提供的生成代码
与系统C编译器
不能比,且对你的用例
很重要,请报告漏洞
.
更改库
isForwardRange
现在带可选元素类型.
isForwardRange
现在有个可选
的默认为void
的第二个模板参数
.如果不是void
,则仅当区间
元素类型与此额外参数
模块常
类型相同时,计算
结果才为true
.
如,isForwardRange!(int[],const(int))
为true
,但isForwardRange!(int[],string)
为false
.