d导入c的一些问题
int printf(char *, ...);
int main()
{
printf("%d\n", (int)sizeof("a"));
}//串字面大小.
接着
// test1.c
int printf(char *, ...);
int main()
{
int a = 0;
// dmd为1,其他编译器为-1
// 删掉括号,漏洞消失
int b = - (a) - 1;
printf("%d\n", b);
}
// test2.c
int example2()
{
int *a, *b;
// 错误`(a) - (cast(char*)b)`: `int*` 和 `char*`不匹配.删除(a)括号,又正确了.
long diff = (char*)(a) - (char*)b;
}
再一个:
void fn()
{
int *p;
// 错误,p非整,是`整*`.
// 去掉(p)括号,又可以了.
unsigned x = (unsigned)(p) & 1;
}
typedef union value_u {
void *p;
} value_t;
typedef struct data_s {
void *p;
} data_t;
void fn()
{
value_t a;
const value_t b;
// 错误,不能隐式转换`常`至`非常`.
a = b;
data_t aa;
const data_t bb;
// 同样错误.
aa = bb;
}
如果,void *p
为非指针类型,则错误消失了.
如果,常
用普通名,而不是typedef
,错误就不见了.
翻译时
static void terminate() {}
//转成
extern(C) private void terminate() {}
时,有冲突,标记为extern(D)
时,改了abi
.
d
为ImportC
加了静态符号
.或许可用@Cstatic
或pragma(noLinkerSymbol)
来暴露给d代码.
即使,带私
,编译器仍发出全局终止
符号至目标
文件.
原因是,元编程时,包括私有
,生成大量符号,跨多文件时,经常相同.D
再放在COMDAT
节中.链接器
只在exe
中有一个.
不合并,导致重复及增加大小.这是重大
变化.
只需要针对-betterC
代码.C
翻译成D
.不知如何处理static
.翻译成私
,仍导致符号冲突.只需要类似ldc
的pragma(LDC_no_moduleinfo)
和pragma(LDC_no_typeinfo)
就行.
// dimodule.di
void fn()() { return; }
// main.d
import dimodule;
void main() { fn(); }
dmd main.d
没问题,dmd -i main.d
对模板参数
报错.
int main() { double x = __builtin_inf(); }
//同样
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现