一步步c到d--最佳c程序员的d教程

文章在此
可以先将make.cdmake.d一起下载下来.
c版,文中有
d版

1,将相应#include,改为d的相应c头.
类似这样

import core.stdc.ctype;
import core.stdc.stdio;
import core.stdc.stdlib;
import core.stdc.string;
import core.stdc.time;
import core.sys.windows.stat;

2,#if _Win32转成version(Windows).
3,相应类似#define debug2(a,b)printf(a,b)这种debug转成debug printf('...').
4,宏定义#define TRUE 1|#define FALSE 0直接将TRUE替换成true.
5,转义符#define ESC '!',转为enum ESC='!';
6,宏定义产生新对象#define NEWOBJ(type) ((type *) mem_calloc(sizeof(type)))变成type* NEWOBJ(type)() { return cast(type*) mem_calloc(type.sizeof); }
即新对象生成是指针,加了个转换类型.
7,结构,将typedef,struct,多余的星号,macro;去掉,macro是关键字.
8,后面的名字filelist;改为alias 小写=大写;
9,char *name,*text;改为char*name, text;,*
10,c数组,genext[EXTMAX+1];,改为char[EXTMAX1]genext;
11,D中模块范围中的static无意义,c中的静态全局等价于d中的私有模块域变量,如不导入模块,这无意义.但仍需要一个__g共享,d中类似,不能为,一线程一个.用一个__gshared块将多个静变量包起来.
12,不用前向声明,删掉.
13,通配符扩展没用,删掉
14,函数指针数组仍然是指针.[]改为星号.

//int cdecl main(int argc,char *argv[])
int main(int argc,char** argv)

15,mem_init();没用,删掉.
16,c代码对函数声明匹配要求很松,d要求全匹配.

void cmderr(const char* format, const char* arg) {
     ...}
// cmderr("...\n");//错误
cmderr("can't expand response file\n", null);

17,全局搜索%s/->/./g.在d中用.访问成员函数
18,用D的版本(...)替换条件编译.
19,缺少函数声明,显示了代码的年代

doswitch(p)
char *p;
{
     //诡异的语法.
//改为
void doswitch(char* p)

20,debug是d关键字,改为xdebug,\n\对D没必要,删掉.
21,用/++/注释掉未用代码
22,static if替换掉#if
23,不自动退化数组,用p.ptr.

// utime(name,timep);
utime(name,timep.ptr);

24,对char*(c风格的串)const,因为d不允许指向不变的串的指针

// linelist **readmakefile(char *makefile,linelist **rl)
linelist **readmakefile(const char *makefile,linelist **rl)

25,d不能隐式将void*转为char*,要加上cast(char*).去掉隐式的目的就是为了始终保持单一的功能.最大限度的去耦.

// buf = mem_realloc(buf,bufmax);//转(*)
buf = cast(char*)mem_realloc(buf,bufmax);

26,用正(uint)替换unsigned,
27,对char *skipname(char*p),可以用inout(),因为输入输出一样.都是相同指针型.改为类似inout(char) *skipspace(inout(char)* p).
28,数组大小宏可改为数组.length:

#define arraysize(array) (sizeof(array) / sizeof(array[0]))//宏定义
// useCOMMAND  |= inarray(p,builtin,arraysize(builtin));
useCOMMAND  |= inarray(p,builtin.ptr,builtin.length)

29,串字面量,是不变的,必须用静态分配数组替代.

// static char envname[] = "@_CMDLINE";
char[10] envname = "@_CMDLINE";

30,用.的大小替换的大小(...).

// q = (char *) mem_calloc(sizeof(envname) + len);
q =cast(char *) mem_calloc(envname.sizeof + len);

31,用void*替换古老的char*用法.

构建make,so easy,妈妈再也不用担心了.

dmd dmake.d dman.d -O -release -betterC shell32.lib

作者说,转换这个没用1个小时,太容易,毕竟是大神啊.
我们致力于将c搞成d,因此能快速转换.
遇到的问题主要是:

1.#includeimport,
2.缺少d版本的相应#include文件
3.用
1.清单常数
2.简单模板
3.函数
4.版本声明
5.调试声明
来替换预处理宏.
4.处理d关键字标识符
5.替换c风格的指针/数组
6.不必要的前向声明/引用.
7.更严格保证类型
8.处理数组
9.用d类型替换c基本类型

以下是不必要的:
1.重构代码
2.改变数据和控制结构
3.改变程序流
4.改变程序工作方式
5.改变内存管理

d的-betterC的可用特性包括:
模块!
内存安全(检查缓冲区溢出)
元编程
RAII(不带异常)
统一码
嵌套函数,嵌套构,闭包,λ
成员函数,构造器,析构器
重载操作符
生成文档
支持函数式编程
编译时执行函数
数组切片,数组边界检查
域(退出)
c++接口,com类,c++类(这个是什么?)
断定(用c运行时库)
switch
final switch
单元测试

评论:

最佳c程序员的d教程.

你可能感兴趣的:(dlang,d,c,make,翻译)