d的ctod工具
原文
下载地址
在ImportC之前,翻译glfw-d和libsoundio-d来帮助翻译的工具.
1库,2库.
用树解析器帮助解析包括预处理器指令的.c或.h文件,然后在需要时,用大致等效的D模式替换C语法模式.
示例:
#include <stdio.h>
#define TAU 6.283185307179586476925
int main(void) {
char buf[32];
sprintf(buf, "tau = %f\n", TAU);
注意, 该行不是C语法
return 0;
}
输出:
module main;
@nogc nothrow:
extern(C): __gshared:
public import core.stdc.stdio;
enum TAU = 6.283185307179586476925;
int main() {
char[32] buf;
sprintf(buf.ptr, "tau = %f\n", TAU);
注意, 该行不是C语法
return 0;
}
你需要翻译(非平凡的)宏,由于D更严格的类型系统而修复错误,及其他杂项ctod尚未正确翻译
问题.
随着ImportC的兴起,该工具的用例减少了,但是如果仍然发现自己转换C为D,我希望这对你有用!
我想说,这对我来说非常有用!我花了很多时间翻译raylib中的一个大约有6000行的文件(它还没有完全完成,只是因为我目前不支持WASM).处理所有死记硬背的乏味问题是最大的痛苦.
有数万行代码需要翻译,其中大部分在raylib从其他项目中截取的仅头文件库中(在"外部"目录中可见).在几个小时的时间里,我已用ctod翻译了其中的3个文件,结果表明对C语言构建的要求更少.
最初计划是保留内部内容为C,因为它仅在内部用于raylib(如音频文件读取,压缩等).我打算为各种架构提供内部C内容的二进制库,这样你就可用dub.
但是现在有了该工具,我想有机会制作完整的移植,所以不需要外部工具或依赖项!
如果你想使用现有库,ImportC非常好.但这仍然表明你正在使用C库.如,raylib的所有文本处理都使用以空字符结尾串.它使用malloc/free内存管理(它充满了缓冲区溢出的可能性,就像典型的C项目可能一样).更不用说缺乏重载等.
使用ImportC,也许可使用raylib与当前的CAPI一起.但是使用ctod,我可在raylib的基础上创建使用起来更加有趣和直观的D库.
谢谢丹尼斯!
浙公网安备 33010602011771号