番禺企业网站建设便宜的seo官网优化
原文
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).v'`assert(&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
条错误消息
后停止,除非传递-verrors=50
或-verrors=0(不限制)
来指定不同的数
.
此错误限制
现在也适合弃用消息
,因此在编译
尚未修复所有弃用
的大项目
时,命令行不会被数百个弃用消息
淹没.
deprecated void f()
{
}
void main()
{f();f();f();f();
}
> dmd verrors=3 app.d
app.d(7)
:废弃:已弃用app.f
函数
app.d(8)
:废弃:已弃用app.f
函数
app.d(9)
:废弃:已弃用app.f
函数
省略了1个弃用警告
,使用-verrors=0
显示所有.
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.length<=I.max
.
4,尚未实现其他情况
.
在闭包上每一逆
现在是一个错误
使用每一逆
时,编译器不会试反向遍历闭包返回的结果
.这会导致难以阅读
的代码
,因此,(多年来)已弃用
.
现在,闭包
上用每一逆
是个错误.
添加
了标识表的扩展
以允许新符
匹配C23
及CLI
可配置性
当前,可对D
和ImportC
,在c99,c11,UAX31(C23)
和all
(最少限制集)间选择
.
这可通过-identifiers=<table>
和对ImportC
用-identifiers-importc=<table>
来完成.
当前按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
,则会调用两者
.