如果采用了同 C 编译器相同的数据类型、内存分布和函数调用/返回指令序列,就可以这样做。
C 函数必须被声明为采用 "C" 调用约定,例如:
extern (C) int strcmp(char *string1, char *string2);然后就可以在 D 代码中很自然的调用它们了:
import std.string;
int myDfunction(char[] s)
{
return strcmp(std.string.toCharz(s), "foo\0");
}
需要注意以下几点: // myfunc() 可以被任何 C 函数调用
extern (C)
{
void myfunc(int a, int b)
{
...
}
}
D 仍然可以使用 c.stdlib.malloc() 和 c.stdlib.free() 显式地分配和释放内存,可用于链接那些需要 malloc 缓冲的 C 函数之类的情况。
如果指向来即收集程序分配的内存的指针被传递给 C 函数,必须确保这份内存不会在使用它的 C 函数退出之前被内存收集程序回收。要达到这个目的,可以:
垃圾收集程序不会扫描不是通过 D Thread 接口创建的线程的堆栈,也不会扫描其它 DLL 中的数据段等。
| D 类型 | C 类型 |
|---|---|
| void | void |
| bit | 无等价类型 |
| byte | signed char |
| ubyte | unsigned char |
| char | char (D 中的 chars 是无符号的) |
| wchar | wchar_t |
| short | short |
| ushort | unsigned short |
| int | int |
| uint | unsigned |
| long | long long |
| ulong | unsigned long long |
| float | float |
| double | double |
| extended | long double |
| imaginary | long double _Imaginary |
| complex | long double _Complex |
| type* | type * |
| type[dim] | type[dim] |
| type[] | 无等价类型 |
| type[type] | 无等价类型 |
| "string\0" | "string" 或 L"string" |
| class | 无等价类型 |
| type(*)(parameters) | type(*)(parameters) |
void foo(char[] string)
{
printf("my string is: %.*s\n", string);
}
机敏的读者会注意到 printf 格式字符串文字量并不以‘\0’结尾。这是因为如果字符串文字量不是数据结构的初始值,就会在结尾处存储一个辅助的‘\0’。C 代码通常使用命令行选项或者各种实现提供的 #pragma 指令指定结构的对齐或者紧缩方式。D 支持与 C 编译器规则对应的显式的对齐特征。可以先查看 C 代码是如何对齐的,然后据此显式地设置 D 结构的对齐方式。
D 不支持位域。如果需要,可以使用移位和 mask 操作进行模拟。
D 的类对象同 C++ 的类对象不兼容。
发表于 @ 2005年03月12日 19:39:00 | 评论( loading... ) | 举报| 收藏