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 ...;
浙公网安备 33010602011771号