d静态导入对象
Posted fqbqrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 :, 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 :;
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 ...;
以上是关于d静态导入对象的主要内容,如果未能解决你的问题,请参考以下文章