int printf(char *, ...);
int main()
{
printf("%d\n", (int)sizeof("a"));
}
接着
int printf(char *, ...);
int main()
{
int a = 0;
int b = - (a) - 1;
printf("%d\n", b);
}
int example2()
{
int *a, *b;
long diff = (char*)(a) - (char*)b;
}
再一个:
void fn()
{
int *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)就行.
void fn()() { return; }
import dimodule;
void main() { fn(); }
dmd main.d没问题,dmd -i main.d对模板参数报错.
int main() { double x = __builtin_inf(); }
|