D语言 (DLang) 2.095.0 发布,增强对 Objective-C 支持
DLang 2.095.0 版本现已发布,该版本主要是增强了对 Objective-C 的支持,增加了声明 Objective-C 协议的能力,以及整个编译器、库和工具的改进。共包括了来自 61 位贡献者的 27 个主要更改和 78 个修复程序。一些亮点内容如下:
- C ++ header 生成
一段时间以来,DMD 已经包含了通过 -CH 命令行选项从 D 源代码生成 C++ header 文件的实验性支持,以便于从 C++ 中调用 D 库。例如,给定以下 D 源文件。
cpp-ex.d
extern(C++):
struct A {
int x;
}
void printA(ref A a) {
import std.stdio : writeln;
writeln(a);
}
和以下命令行:
dmd -HC cpp-ex.d
编译器将以下内容输出到 stdout(-HCf 指定一个文件名,-HCd 指定一个目录)。
// Automatically generated by Digital Mars D Compiler
#pragma once
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <math.h>
#ifdef CUSTOM_D_ARRAY_TYPE
#define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
#else
/// Represents a D [] array
template<typename T>
struct _d_dynamicArray
{
size_t length;
T *ptr;
_d_dynamicArray() : length(0), ptr(NULL) { }
_d_dynamicArray(size_t length_in, T *ptr_in)
: length(length_in), ptr(ptr_in) { }
T& operator[](const size_t idx) {
assert(idx < length);
return ptr[idx];
}
const T& operator[](const size_t idx) const {
assert(idx < length);
return ptr[idx];
}
};
#endif
struct A;
struct A
{
int32_t x;
A() :
x()
{
}
};
extern void printA(A& a);
此版本对该功能进行了许多修复和改进。需要注意的是,通过 -H、-Hf 和 -Hd 也支持生成 C headers。
- 默认的 C ++ 标准更改
现在默认使用 C++11 标准。此外,编译器现在将接受 -extern-std=c++20。在实践中,目前唯一的影响是改变了编译时的值,__traits(getTargetInfo, "cppStd"),但将来可能会增加新的类型。
- 改进的 Objective-C 支持
此版本通过支持 Objective-C 协议增强了 Objective-C 的兼容性。这是通过在 extern(Objective-C) 上下文中重新使用接口来实现的。此外,@optional 和 @selector 属性有助于完成这项工作。
- 改进的 compile-time feedback
更多详情可查看更改日志:https://dlang.org/changelog/2.095.0.html