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