28用d编程模块

static this() 和static ~this(),模块构造和析构函数,每线程一次,总程序一次的,可用shared static this() 和 shared static ~this()
一堆模块叫一个包.
import std.stdio;
选择导入:import std.stdio :writeln;,减少名称冲突
本地导入,可以最小化外部依赖

import carnivore = animal.jaguar;
import vehicle = car.jaguar;

重命名,避免冲突.

// The contents of the file animal/package.d:
module animal;

public import animal.cat;
public import animal.dog;
public import animal.horse;

一个:package.d:可导入多个子包.如上书写.
公开导入则始终可用

deprecated("过时了.")
void do_something() {
    // ...
}

编译器开关:
-d,表允许使用过时开关
-dw,使用时发出警告.
-de,使用时则报错误
可以用

deprecated("Please use doSomething() instead.")
alias do_something = doSomething;

来继续使用旧名字,但实际用的新函数.
dmd deneme.d animal/cat.d animal/dog.d -w -de还要加上其他文件,才能编译.
生成库命令:
dmd animal/cat.d animal/dog.d -lib -ofanimal -w -de,关键在-lib,-of表输出名字.
这样dmd deneme.d animal.lib -w -de就可以了.因为库中有链接.

module deneme;

import std.stdio;
import core.demangle;

void foo() {
}

void main() {
    writeln(mangle!(typeof(foo))("deneme.foo"));
}//_D6deneme3fooFZv,

可用来取混杂名.以方便链接外部库啊,c++库啊.
外部链接类型有C, C++, D, Objective-C, Pascal, System, 和 Windows.
需要链接c库时

extern(C) void foo();//c样式的链接

void main() {
    foo();  // 将编译为调用'_foo'
}

c类型都是前面加个下划线.调用c++如下:

extern(C++, a.b.c) void bar();
void main() {
    bar();          // a call to a::b::c::bar()
    a.b.c.bar();    //类似上面 
}

D库绑定
extern还有一个意思:该变量是外部存储的.类似c/c++.
d编译器不用保留空间.
extern(C) extern int g_variable;表明,本变量已在外部的c库定义.不用自己搞一个.
如果这样extern(C) int g_variable;表明用c链接的一个d变量.
有两个含义:1是链接方式,2是在外部存储.

发布了405 篇原创文章 · 获赞 25 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/104588298