- 浏览: 221162 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
dysking:
SWT 和 JFace -
wangyuhfut:
东西不少啊。学习中。。。
一个比较好、中文说明的emacs配置文件 1 -
pacocai:
呵呵!学习,学习~~~不过要说编辑器的话个人更喜欢用VIM,比 ...
一个比较好、中文说明的emacs配置文件 1 -
zhf1zhf2:
这两百多个记起来也不容易啊
英国人是这样背的! -
regex:
试了两次,都是乱码,版本是23.1.1,看来不适合
汉化 Emacs 菜单
D 的设计就是要在目标系统上能够很好地符合于 C 编译器。D 通过依赖于目标环境上的 C
运行库,来弥补没有自己的 VM(虚拟机) 的不足。将大量现有的 C 的 API 移植到 D 或者
用 D 来进行封装,并没有多大意义。直接调用它们不是要方便得多。
如果采用跟 C 编译器相同的数据类型、内存分布(layout)和函数调用/返回序列,那么它就可
以实现。
5.1 调用 C 函数
D 可以直接调用 C 函数。不需要封装函数、参数变换,同时也不需要将 C 函数放到单独的
DLL 中。
C 函数必须被声明,而且必须指定调用协定,大部份情况下为 "C" 调用约定,例如:
extern (C) int strcmp(char* string1, char* string2);
然后就可以在 D 代码中很自然的调用它们了:
import std.string;
int myDfunction(char[] s)
{
return strcmp(std.string.toStringz(s), "foo");
}
需要注意以下几点:
• D 知道 C 函数名的变换规则及函数的调用/返回指令序列。
• C 函数不能被另一个同名的 C 函数重载。
• D 中没有如 __cdecl、__far、__stdcall、__declspec 或者如此之类的 C 类型修饰符。
这个可以使用一些特性,如 extern (C),来进行处理。
• D 中没有 const 或 volatile 类型修饰符。想要声明那些使用了这类类型修饰符的 C 函
数,则仅需要从声明中移除这些关键字即可。
• D 中的字符串不是以 0 结尾的。关于此点的更多信息,请参见“数据类型兼容
性”。但是,D 里的字符串文字是以 0 结尾的。
同样地,C 代码也可以调用 D 函数,只要 D 函数采用了同 C 编译器兼容的特性,多数情
况是 extern (C):
// myfunc() 可以被任何 C 函数调用
extern (C)
{
void myfunc(int a, int b)
{
...
}
}
107
第 5 章 C 语言接口 — 张雪平
5.2 存储分配
C 代码通过调用 malloc() 和 free() 显示地管理内存。D 使用 D 垃圾收集程序分配内存,所
以不需要显式地释放内存。
D 仍然可以使用 c.stdlib.malloc() 和 c.stdlib.free() 显式地分配和释放内存,可用于链接那些
需要 malloc 缓冲的 C 函数之类的情况。
如果指向来即收集程序分配的内存的指针被传递给 C 函数,必须确保这份内存不会在使用
它的 C 函数退出之前被内存收集程序回收。要达到这个目的,可以:
• 使用 c.stdlib.malloc() 创建一份数据的副本,把该副本传递给 C 函数。
• 将指针放在堆栈上(作为参数或者自动变量),因为垃圾收集程序会扫描堆栈。
• 将指向它的指针放在静态数据段,因为垃圾收集程序会扫描静态数据段。
• 使用 gc.addRoot() 或者 gc.addRange() 将指针交由垃圾收集程序管理。
上面几处c.x.x 2.014中均改为 std.c.x.x
就算是指向所分配内存块内部的指针也足以让 GC 知道对象正在使用;也就是,不一定要需
要维护指向所分配内存开始处的指针。
垃圾收集程序不会扫描不是通过 D Thread 接口创建的线程的堆栈。也不会扫描其它 DLL
中的数据段等。
5.3 数据类型兼容性
D And C Type Equivalence 2.014
D 类型 C 类型
void void
bit 无等价类型 (2.014中无bit 类型)
byte signed char
ubyte unsigned char
char char (在 D 里 chars 是 unsigned)
wchar wchar_t (当 sizeof(wchar_t) 为 2 时)
dchar wchar_t (当 sizeof(wchar_t) 为 4 时)
short short
ushort unsigned short
int int
uint unsigned
long long long
ulong unsigned long long
float float
double double
real long double
ifloat float _Imaginary
idouble double _Imaginary
ireal long double _Imaginary
cfloat float _Complex
cdouble double _Complex
creal long double _Complex
struct struct
union union
enum enum
class 无等价类型
type* type *
type[dim] type[dim]
type[dim]* type(*)[dim]
type[] 无等价类型
type[type] 无等价类型
type function(parameters) type(*)(parameters)
type delegate(parameters) 无等价类型
对于大多数的 32 位 C 编译器来说,上述对应关系是成立的。C 标准并不约束类型的大小,
所以使用这种对应关系时要格外小心。
5.4 调用 printf()
主要的问题是 printf 格式指示符如何匹配对应的 D 数据类型。尽管按照设计,printf 只能处理以 0 结尾的字符串,不能处理 D 的char 动态数组,但事实证明,由于 D 动态数组的结构是{长度,指向数据的指针},printf 的 %.*s 格式工作的很好:
void foo(char[] string)
{
printf("my string is: %.*s\n", string);
}
机敏的读者会注意到 printf 格式字符串文字量并不以‘\0’结尾。这是因为如果字符串文字量
不是数据结构的初始值,就会在结尾处存储一个辅助的‘\0’。
有一个改进的 D 函数可以用于格式化输出,它就是 std.stdio.writef()。
5.5 结构和联合
D 的结构和联合同 C 中的相似。
C 代码通常使用命令行选项或者各种实现提供的 #pragma 指令指定结构的对齐或者紧缩方
式。D 支持与 C 编译器规则对应的显式的对齐特征。可以先查看 C 代码是如何对齐的,然
后据此显式地设置 D 结构的对齐方式。
D 不支持位域(bit field)。如有必要,则可以使用移位(shift)和屏蔽(mask)操作来进行模拟。htod will convert bit fields to inline functions that do the right shift and masks. 1.024
1.030
Interfacing to C++
D does not provide an interface to C++. Since D, however, interfaces directly to C, it can interface directly to C++ code if it is declared as having C linkage.
D class objects are incompatible with C++ class objects
运行库,来弥补没有自己的 VM(虚拟机) 的不足。将大量现有的 C 的 API 移植到 D 或者
用 D 来进行封装,并没有多大意义。直接调用它们不是要方便得多。
如果采用跟 C 编译器相同的数据类型、内存分布(layout)和函数调用/返回序列,那么它就可
以实现。
5.1 调用 C 函数
D 可以直接调用 C 函数。不需要封装函数、参数变换,同时也不需要将 C 函数放到单独的
DLL 中。
C 函数必须被声明,而且必须指定调用协定,大部份情况下为 "C" 调用约定,例如:
extern (C) int strcmp(char* string1, char* string2);
然后就可以在 D 代码中很自然的调用它们了:
import std.string;
int myDfunction(char[] s)
{
return strcmp(std.string.toStringz(s), "foo");
}
需要注意以下几点:
• D 知道 C 函数名的变换规则及函数的调用/返回指令序列。
• C 函数不能被另一个同名的 C 函数重载。
• D 中没有如 __cdecl、__far、__stdcall、__declspec 或者如此之类的 C 类型修饰符。
这个可以使用一些特性,如 extern (C),来进行处理。
• D 中没有 const 或 volatile 类型修饰符。想要声明那些使用了这类类型修饰符的 C 函
数,则仅需要从声明中移除这些关键字即可。
• D 中的字符串不是以 0 结尾的。关于此点的更多信息,请参见“数据类型兼容
性”。但是,D 里的字符串文字是以 0 结尾的。
同样地,C 代码也可以调用 D 函数,只要 D 函数采用了同 C 编译器兼容的特性,多数情
况是 extern (C):
// myfunc() 可以被任何 C 函数调用
extern (C)
{
void myfunc(int a, int b)
{
...
}
}
107
第 5 章 C 语言接口 — 张雪平
5.2 存储分配
C 代码通过调用 malloc() 和 free() 显示地管理内存。D 使用 D 垃圾收集程序分配内存,所
以不需要显式地释放内存。
D 仍然可以使用 c.stdlib.malloc() 和 c.stdlib.free() 显式地分配和释放内存,可用于链接那些
需要 malloc 缓冲的 C 函数之类的情况。
如果指向来即收集程序分配的内存的指针被传递给 C 函数,必须确保这份内存不会在使用
它的 C 函数退出之前被内存收集程序回收。要达到这个目的,可以:
• 使用 c.stdlib.malloc() 创建一份数据的副本,把该副本传递给 C 函数。
• 将指针放在堆栈上(作为参数或者自动变量),因为垃圾收集程序会扫描堆栈。
• 将指向它的指针放在静态数据段,因为垃圾收集程序会扫描静态数据段。
• 使用 gc.addRoot() 或者 gc.addRange() 将指针交由垃圾收集程序管理。
上面几处c.x.x 2.014中均改为 std.c.x.x
就算是指向所分配内存块内部的指针也足以让 GC 知道对象正在使用;也就是,不一定要需
要维护指向所分配内存开始处的指针。
垃圾收集程序不会扫描不是通过 D Thread 接口创建的线程的堆栈。也不会扫描其它 DLL
中的数据段等。
5.3 数据类型兼容性
D And C Type Equivalence 2.014
D 类型 C 类型
void void
bit 无等价类型 (2.014中无bit 类型)
byte signed char
ubyte unsigned char
char char (在 D 里 chars 是 unsigned)
wchar wchar_t (当 sizeof(wchar_t) 为 2 时)
dchar wchar_t (当 sizeof(wchar_t) 为 4 时)
short short
ushort unsigned short
int int
uint unsigned
long long long
ulong unsigned long long
float float
double double
real long double
ifloat float _Imaginary
idouble double _Imaginary
ireal long double _Imaginary
cfloat float _Complex
cdouble double _Complex
creal long double _Complex
struct struct
union union
enum enum
class 无等价类型
type* type *
type[dim] type[dim]
type[dim]* type(*)[dim]
type[] 无等价类型
type[type] 无等价类型
type function(parameters) type(*)(parameters)
type delegate(parameters) 无等价类型
对于大多数的 32 位 C 编译器来说,上述对应关系是成立的。C 标准并不约束类型的大小,
所以使用这种对应关系时要格外小心。
5.4 调用 printf()
主要的问题是 printf 格式指示符如何匹配对应的 D 数据类型。尽管按照设计,printf 只能处理以 0 结尾的字符串,不能处理 D 的char 动态数组,但事实证明,由于 D 动态数组的结构是{长度,指向数据的指针},printf 的 %.*s 格式工作的很好:
void foo(char[] string)
{
printf("my string is: %.*s\n", string);
}
机敏的读者会注意到 printf 格式字符串文字量并不以‘\0’结尾。这是因为如果字符串文字量
不是数据结构的初始值,就会在结尾处存储一个辅助的‘\0’。
有一个改进的 D 函数可以用于格式化输出,它就是 std.stdio.writef()。
5.5 结构和联合
D 的结构和联合同 C 中的相似。
C 代码通常使用命令行选项或者各种实现提供的 #pragma 指令指定结构的对齐或者紧缩方
式。D 支持与 C 编译器规则对应的显式的对齐特征。可以先查看 C 代码是如何对齐的,然
后据此显式地设置 D 结构的对齐方式。
D 不支持位域(bit field)。如有必要,则可以使用移位(shift)和屏蔽(mask)操作来进行模拟。htod will convert bit fields to inline functions that do the right shift and masks. 1.024
1.030
Interfacing to C++
D does not provide an interface to C++. Since D, however, interfaces directly to C, it can interface directly to C++ code if it is declared as having C linkage.
D class objects are incompatible with C++ class objects
发表评论
-
土耳其文《d编程》range 翻译 一
2011-11-15 02:01 1508Ranges 范围 Ranges are an abstra ... -
土耳其文《d编程》range 翻译 二
2011-11-15 01:59 1008As you can see, that output doe ... -
d2 range 和 标准C++中的Iterator(迭代器)简介
2011-05-07 12:59 2118原文: http://hi.baidu.com/c ... -
三访安德烈Alexandrescu(第2部)
2010-08-20 12:53 1424Google翻译哦 面试------> 应翻成 访谈 ... -
三访安德烈Alexandrescu(第一部分)
2010-08-20 12:43 1350google翻译哦 Interview with Andre ... -
Garden Editor project 日记 之二 10.16 ---
2009-10-16 02:39 02009.10.16 T[new] misgivings ... -
Garden Editor project 日记 之一 09.09.25 --- 10.15
2009-09-24 22:56 0kill two birds with one stone, ... -
template metaprogramming 9
2009-09-09 16:08 1171原文:https://docs.google.co ... -
Floating Point in D (2.030 新)
2009-05-12 23:27 20495.17 23:50 更新 5.16 20:30 翻译更 ... -
Migrating to Shared (2.030 新)
2009-05-12 23:03 11565.19 0:10 更新(完成) ... -
D 2.0 的gc
2008-12-04 19:53 1252http://lucifer1982.wordpress.co ... -
垃圾回收 2.014
2008-06-10 07:20 984无版本差异 D 是一种全面采用垃圾回收(Garbage Co ... -
类 class 2.014
2008-06-09 22:51 1087D 的面向对象的特性都来源于类。类层次里的顶层是 Object ... -
接 口 2.014
2008-06-09 22:51 845接口声明: interface 标 ... -
Traits 特征 2.014
2008-06-07 11:25 12476.14 翻译 (d语言的反 ... -
常量和不变量 Const and Invariant 2.014
2008-06-07 11:22 1313请参考: D 2.0 Const/Final/Invarian ... -
词法 2.014
2008-06-07 10:22 1502在 D 中,词法分析独立于语法分析和语义分析。词法分析器是将源 ... -
枚 举 2.014
2008-06-07 08:41 1156枚举声明: enum 枚举标记 枚举体 enum 枚举体 en ... -
函 数 2 (2.014)
2008-06-07 08:22 10337 嵌套函数 函数可以被 ... -
函 数 2.014
2008-06-07 08:21 1298[size=large]函数体: 块 ...
相关推荐
2. **构建强大的后端服务器**: - **理解Node.js和Express.js**:深入学习这两种技术的特点及其在构建后端服务器中的应用。 - **设计良好的RESTful API**:通过示例展示如何设计RESTful风格的API接口,包括GET、...
根据提供的文件信息,我们可以得出这份文档是关于R7F0C014B2D与R7F0C014L2D型号单片机的用户手册硬件篇。接下来,我们将从标题、描述以及部分展示的内容中提取关键知识点。 ### 关键知识点一:R7F0C014B2D与R7F0C...
1. **接口连接**:R7F0C014L2D如何通过数据线、时钟线和控制线与LCD模块进行通信,包括初始化序列、命令传输和数据写入的细节。 2. **LCD控制器**:解释微控制器内置的LCD控制器特性,如帧缓冲区管理、时序控制、...
在编程层面,手册可能包含了一些示例代码,展示如何利用汇编语言或C语言编写控制LCD的程序。这包括点画图、文本显示、滚动条效果等功能的实现。开发者可以通过这些示例学习到如何设置LCD控制器寄存器,以及如何高效...
2. 利用Java的跨平台特性:编写一次Delphi应用,借助J4D,可以在任何支持Java的平台上运行。 3. 整合Java服务:将Java作为后端服务,Delphi作为前端UI,构建分布式系统。 4. 利用Java的高性能库:例如,Java有许多...
2. **程序设计** - **模块划分**:根据设计原则、方法和标准进行模块化,要求达到"II"级别,能编写相关文档。 - **程序设计评审**:对设计的检查和确认,确保其符合需求。 3. **程序实现** - **编程方法和规范**...
本案例基于SWMM5.1.014版本,通过C/C++语言进行代码扩展,旨在帮助学习者理解SWMM的工作原理,并掌握如何进行模拟以及读取out、inp文件内容的操作。 首先,了解SWMM的基本概念是至关重要的。SWMM的核心功能是对城市...
2. **SpringBoot核心组件** - **Spring Boot Starter**: 用于简化配置,提供了一系列的“starter”依赖项,例如数据访问(JPA)、Web服务、安全等。 - **Spring MVC**: 作为Web应用的核心,处理HTTP请求和响应。 ...
2. **数据结构与算法**:初级程序员需要掌握基本的数据结构,如数组、链表、栈、队列、树、图等,以及常见的排序和搜索算法,如冒泡排序、快速排序、二分查找等。 3. **编程语言基础**:根据题目,可能涉及C、C++、...
- Type-C Cable:用于充电和数据传输,Type-C接口支持高速数据交换,同时兼容多种设备。 - Quick Start Guide:快速启动指南,帮助新用户快速了解设备的基本操作和设置。 - Warranty Sheet:保修单,证明购买后的...
3个用于测试的高清视频”,这表明压缩包内包含了三个高清晰度的视频文件:0049-c014.mp4、0044-c007.mp4、0046-c019.mp4。这些视频文件可以用来测试我们的代码,确保在不同格式和内容的视频上都能正确地调整分辨率...
2. 示例代码:可能是用C或汇编语言编写的,展示了如何控制AT45DB014D进行读写操作,对初学者尤其有帮助。 3. 应用笔记或教程:解释了如何将AT45DB014D集成到实际项目中,可能包括硬件连接指南和软件实现步骤。 4. ...
2. **程序编写**:用C语言或汇编语言编写代码,实现电流值的读取、处理和在LCD上的显示。 3. **仿真验证**:在Proteus环境中运行程序,检查电流表的响应是否符合预期。 4. **调试优化**:如果仿真结果不正确,可以...
string sqlUpdate = "UPDATE " + table + " SET other='2', rate=1.014"; cmd.CommandText = sqlUpdate; cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); // 查询DBF文件中的数据 string sql...
在完成编码后,Keil IDE可以生成一个项目文件(如"Keil_AT89C51RD2_014_IIC_lcd1602pt.pdsprj"),保存了工程设置和源代码信息。 将Keil编译的HEX文件导入到Proteus,即可进行仿真。在Proteus环境中,我们可以观察...
2. 控制逻辑:这部分代码负责解析用户输入的电话号码,确认无误后生成相应的AT命令。AT命令是通用的串行通信协议,用于控制调制解调器或其他通信设备。在这个项目中,我们需要设置特定的AT命令来执行拨号操作,如...
正则化后MFLOPS = \frac{195578}{13.6 \times 10^6} = 0.014 \] 3. **指令正则化后的具体值**: \[ 指令正则化后的具体值 = \frac{f}{CPI} = \frac{16.6M}{6 \times 10^6} = 2.77 \] 通过计算,我们可以比较优化...
2. **模板**:C++中的模板是泛型编程的基础,可以用于创建泛型函数和泛型类,以实现代码的高效复用,提高程序的灵活性。 3. **STL(Standard Template Library)标准模板库**:包括容器(如vector、list、set等)、...
2. **文件安全与权限**(001文件安全与权限.pdf):在Linux/Unix中,文件和目录具有读(r)、写(w)和执行(x)权限,分别对应数字4、2和1。用户可以设置用户权限、组权限和其他用户的权限,通过`chmod`命令进行...