本文来自http://blog.csdn.net/lijun84
,引用必须注明出处!
<!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
本文来自我实践中以及阅读优秀开源项目的技巧手法总结。更多是从设计和代码结构技巧上考虑,希望对大家提供
C
编程有所帮助。
1
,
开发跨平台的一种结构体实现
(说明代码提取自
LCC
编译器源码)
//
定义跨平台的结构体
.
typedef
struct binding {
char
*name; //
标识一个平台的名子
.
Interface
*ir; //
跨平台的接口结构
,
一般声明需要跨平台的操作函数的指针和一些变量
.
}
Binding;
//
可以先把每个平台的接口对象绑定好
.
Binding
binds[]{
//
象
alphaIR
这些对象和它们中定义函数指针对应的函数实现可以定义在如
alpha.c
这样命名的文件中
"alpha/osf",&alphaIR,
"mips/irix",&mipsebIR,
"sparc/sun",&sparcIR
};
//
下面使用起来就很方便了
,
无论是从命令行取平台名子动态绑定还是用宏来在编译时绑定
.
如
(
动态绑定
):for (j = 0; bindings[j].name && bindings[j].ir; j++)
//
根据
-target
参数的值来确定平台
if
(strcmp(&argv[i][8], bindings[j].name) == 0) {
IR
= bindings[j].ir; //
绑定到特定平台的接口
break;
}
2
,巧用宏来减少代码量,使代码更美观
(说明代码提取自
LCC
编译器源码)
<!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
3
,巧用联合体
(说明代码提取自
LCC
编译器源码)
<!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
4
,
用通用结构体头实现
C
的
OO
封装
(说明代码提取自
Ruby
源码)
<!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]--><!-- [if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
struct RBasic
的设计是为了包含由所有对象结构体共享的一些重要信息的。struct RBasic
的定义如下:
struct RBasic
struct RBasic {
unsigned long flags;
VALUE klass;
};
flags
是个多目的的标记,大多用以记录结构体类型
(
比如,
struct
RObject)
。类型标记命名为
T_xxxx
,可以使用宏
TYPE()
从
VALUE
中获得。这是一个例子:
VALUE str;
str = rb_str_new(); /*
创建
Ruby
字符串(其结构体是
RString
)
*/
TYPE(str); /*
返回值是
T_STRING */
这些
T_xxxx
标记的名字直接与其对应的类型名相关,如
T_STRING
表示
struct RString
、
T_ARRAY
表示
struct RArray
。
struct RBasic
的另一个成员,
klass
,包含了这个对象归属的类。因为
klass
成员是
VALUE
类型
,
它存储的是(一个指针指向)一个
Ruby
对象。简言之,它是一个类对象。
函数指针表和变量表实现成员函数和成员变量的封装:
struct RClass {
struct
RBasic basic;
struct
st_table *iv_tbl;
struct st_table *m_tbl;
VALUE
super;
};
struct
st_table
是一个在
ruby
中到处使用的
hash
表,但基本上,它就是一个将名字映射为对象的表。在
m_tbl
中,持有这个类所拥有方法的名称(
ID
)与方法实体本身之间的对应关系。
分享到:
相关推荐
本文将详细介绍51单片机的外部结构、内部I/O部件以及C语言编程基础,并通过实例展示如何通过编程控制单片机的引脚状态。 51单片机的外部结构主要包括以下几个部分: 1. DIP40封装,双列直插40个引脚。 2. P0、P1、...
下面将根据给定的文件信息,详细解析《菜鸟编程10大好习惯:菜鸟变老鸟》中的关键知识点,帮助读者理解并实践这些习惯,从而加速个人成长。 ### 1. **重视计划与细节** 首先,养成重视计划的习惯是编程的基础。这...
For i = 1 To 1000 Step 10是循环语句的示例,i是变量,循环每执行一次,i的值增加10,当i达到1000时,结束循环。 通过这个教程,读者可以学习VBA的基础知识和实践应用,为CAD二次开发提供了有价值的参考。
本文将详细解析并归纳“50个老鸟常去的C源代码网站”中提及的精选网站,为读者提供一个全面的资源指南,涵盖从学习资料到专业项目开发所需的各种C/C++源代码。 1. **DZone Snippets ...
《别样诠释:一个Visual C++老鸟10年学习与开发心得》是关于资深开发者在Visual C++领域的深入探索和实践经验的总结。通过这个标题,我们可以了解到这是一本聚焦于Visual C++编程语言,尤其是从长期实践者的角度出发...
以下将详细解读这40条“老鸟程序员才知道的小技巧”,并尽可能全面地挖掘其中的知识点。 1. 重构是程序员的主力技能:重构,即对软件代码进行结构上的优化而不改变其外部行为的过程,是程序员提高代码质量的重要...
#6软件编程出生的我们毕业后该何去何从?来听听老鸟的建议
《Java入门1·2·3:一个老鸟的Java学习心得》适合广大想学习一门编程语言的读者、没有任何基础的Java入门读者、Java自学人员、从其他语言转向Java语言的读者、大中专院校的学生和社会培训学生。
Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka Java 『必看』2021 版最新Java 学习路线图(持续刷新):+1::+1::+1: Java入门面试题 Java基础入门80问,适合新手,老鸟直接跳过 Java并发编程(J.U.C) ...
此资源纯属本人键盘敲击拍打而来,献给乐于分享热爱Java编程的人
别样诠释 一个Visual C++老鸟10年学习与开发心得
根据给定文件的信息,我们可以提炼出四个C语言编程示例的关键知识点,这些示例旨在帮助初学者提升C语言技能。 ### 第一个示例:生成不同的三位数组合 **描述**: 此程序的目标是生成所有可能的三位数组合,其中三...
《十年老鸟VC++开发,别样诠释代码光盘资源》是一本专为初学者设计的VC++编程书籍,由一位拥有十年经验的资深开发者编著。这本书的独特之处在于,它不仅提供了详尽的理论知识讲解,还通过附带的光盘资源帮助读者避免...
本压缩包包含了丰富的“综合资源”,涵盖了LabVIEW的基础概念、编程技巧以及实际应用案例。 LabVIEW,全称Laboratory Virtual Instrument Engineering Workbench(实验室虚拟仪器工程工作台),是一款图形化编程...
对于计算机,也许你是老鸟,也许你是菜鸟…… 但不管怎样,如果你此时此地你要学习编程,那么你应该多多少少知道点什么叫硬件什么叫软件——反正我不管你懂不懂,为了面子,我很不乐意你问我什么叫硬件什么叫软件...
一个老鸟的Java学习心得 -- 1·2·3
第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP编程、Java UDP编程、Java Swing编程、JDBC编程,最后还给出了一个聊天程序实例和一个数据表操作窗口实例,将Swing、UDP、...
资源名称:Java入门1·2·3——一个老鸟的Java学习心得内容简介:本书是一本与众不同的Java入门好书。作者以独特的视角,向Java初学者讲述了如何才能真正理解和掌握Java语言。本书充分考虑了初学Java语言的种种困难...
了解函数表达式和函数声明的区别,以及闭包的概念,对于提升编程技巧至关重要。而箭头函数的引入,简化了函数定义的语法,是ES6新增的重要特性。 接下来,深入学习对象和原型。JavaScript的万物皆对象,每个对象都...