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.
dImportC加了静态符号.或许可用@Cstaticpragma(noLinkerSymbol)来暴露给d代码.
即使,带,编译器仍发出全局终止符号至目标文件.

原因是,元编程时,包括私有,生成大量符号,跨多文件时,经常相同.D再放在COMDAT节中.链接器只在exe中有一个.
不合并,导致重复及增加大小.这是重大变化.

只需要针对-betterC代码.C翻译成D.不知如何处理static.翻译成,仍导致符号冲突.只需要类似ldcpragma(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(); }
//同样
posted @   zjh6  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示