d静态导入对象
d静态导入对象
你知道可静态导入对象
并抑制自动隐式导入
吗?
static import object;
IainBuclaw
在github
评论中指出D编译器
将不会隐式导入对象(import object;)
;如果在定义模块
后的第一件事
是你自己的静态导入对象;
module test;
static import object;
void main() {}
编译会提示从object.d
来的未定义_d_cmain
标识符错误.当然,可只导入需要的:
module test;
static import object;
import object : _d_cmain, string, idup;
void main() {
string s = "foo".idup;
}
工作.但有趣的是,在D中
隐式导入
的内置对象模块
定义.
如,串
不是语言关键字
.相反,与dup,idup
相同,是在object
模块中定义的.
alias string = immutable(char)[];
是的,可局部
覆盖它们:
module test;
alias string = int;
void main() {
string s = "foo".idup;
}
错误:无法隐式转换idup("foo")
串类型为int
.
这是因为与查找
其他符号相同的查找规则
.如果:
module test;
alias string = int;//转为整.
void main() {
object.string s = "foo".idup;//串类型
}
现在查找对象
模块并工作.
回到静态导入对象
,看看以为
内置但并不是的其他东西
.
module test;
static import object;
import object : _d_cmain;
void main() {
object.string s = "foo";
}
_d_cmain
是什么东西?
包含Cmain
及用来初化druntime
并调用Dmain
的函数
的模板.编译器对包含D主函数
声明的模块
都会生成mixin _d_cmain();
来注入代码
进模块.
ddoc
会生成,但dpldocs.info
不会.
注释说"这段代码
.
module test;
//不必,只需如下局部覆盖
// static import object;
// import object : _d_cmain;//这一行,就覆盖了.
template _d_cmain() {
extern(C) int main() {
return 0;
}//生成主函数.
}
void main() {
import core.stdc.stdio;
printf("你好,D!\n");
}
编译运行,看到你好,D
了吗?没有!定义的_d_cmain
覆盖了你的!
要求编译器用object._d_interpolated
而不是仅_d_interpolated
来禁止局部
覆盖.然而,显然dmd
自身并没有那么严格.
这是用户偶然调用object.destroy
,引起.应该这样用object
模块:
static import object;
import object ...;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现