当前位置: 首页 > news >正文

2501d,d.109

原文

2.109.0带来了15主要更改26个修复的Bugzilla问题.非常感谢39位贡献者,是他们使2.109.0变成可能.

更改编译器

1,[下一版]现在,为类型实例成员设置别名是个错误
2,添加位字段内省功能
3,添加了从CTFE写入消息的__ctfeWrite
4,现在-verrors也限制弃用警告
5,dtohextern(Windows)extern(System)函数生成签名.
6,动态数组上的每一可有小于size_t索引类型
7,在闭包上每一逆现在是个错误
8,添加标识表的扩展以允许新符匹配C23CLI可配置性
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显示所有.

dtohextern(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,尚未实现其他情况.

在闭包上每一逆现在是一个错误

使用每一逆时,编译器不会试反向遍历闭包返回的结果.这会导致难以阅读代码,因此,(多年来)已弃用.
现在,闭包上用每一逆是个错误.

添加标识表的扩展以允许新符匹配C23CLI可配置性

当前,可对DImportC,在c99,c11,UAX31(C23)all(最少限制集)间选择.
这可通过-identifiers=<table>和对ImportC-identifiers-importc=<table>来完成.

当前按all设置D的默认表,而按c11设置ImportC.以前,DImportC都使用c99表.
稍后D的表会切换到UAX31,这应该在2.117中完成.如果你此时正在使用c99指定符,且不愿意更改它们,可切换all.

ImportC改进了统一支持

现在支持通用符名,允许按标识的一部分使用\uXXXX\UXXXXXXXX语法,其中X十六进制数字.
DigitalMarssppn不支持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,moldMicrosoftLINK.如果未检测到链接器的错误,请提交问题.

已删除窗口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.preExecDelegatestd.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为兼容而保留,如果同时给出了preExecFunctionpreExecDelegate,则会调用两者.

http://www.lryc.cn/news/514241.html

相关文章:

  • 1、蓝牙打印机环境搭建
  • Axure RP11安装学习
  • axios和fetch的实现原理以及区别,与XMLHttpRequest的关系,并结合react封装统一请求示例
  • 矩阵运算提速——玩转opencv::Mat
  • C++软件设计模式之模板方法模式
  • 神经网络的初始化方式都有哪些?
  • const成员函数
  • 物理知识1——电流
  • 车载通信架构 --- 智能汽车通信前沿技术
  • Flutter中添加全局防护水印的实现
  • BGP(Border Gateway Protocol)路由收集器
  • 【DAGMM】直接跑tip
  • vscode中调用deepseek实现AI辅助编程
  • AI大模型语音识别转文字
  • 可由 (5V) 单片机直接驱动的模块
  • vue使用树形结构展示文件和文件夹
  • PHP框架+gatewayworker实现在线1对1聊天--聊天界面布局+创建websocket连接(5)
  • LinuxUbuntu打开VSCode白屏解决方案
  • 在 ESP 上运行 AWTK
  • 硬件工程师面试题 21-30
  • 开源架构的容器化部署优化版
  • Qt使用CMake编译项目时报错:#undefined reference to `vtable for MainView‘
  • python学习笔记—12—
  • ==和===的区别,被坑的一天
  • 基于 GPUTasker 的 GPU 使用情况钉钉推送机器人实现
  • Python自学 - 函数初步(内置函数、模块函数、自定义函数)
  • 【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)
  • HTML5新特性|01 音频视频
  • 迅为RK3568开发板编译Android12源码包-设置屏幕配置
  • 力扣hot100——图论