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(); }
//同样