`
izuoyan
  • 浏览: 9231769 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C老鸟编程技巧总结 (1)

阅读更多

本文来自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单片机C语言编程实例

    本文将详细介绍51单片机的外部结构、内部I/O部件以及C语言编程基础,并通过实例展示如何通过编程控制单片机的引脚状态。 51单片机的外部结构主要包括以下几个部分: 1. DIP40封装,双列直插40个引脚。 2. P0、P1、...

    菜鸟编程10大好习惯菜鸟变老鸟

    下面将根据给定的文件信息,详细解析《菜鸟编程10大好习惯:菜鸟变老鸟》中的关键知识点,帮助读者理解并实践这些习惯,从而加速个人成长。 ### 1. **重视计划与细节** 首先,养成重视计划的习惯是编程的基础。这...

    vba学习 一个老鸟的吐血总结(转载)

    For i = 1 To 1000 Step 10是循环语句的示例,i是变量,循环每执行一次,i的值增加10,当i达到1000时,结束循环。 通过这个教程,读者可以学习VBA的基础知识和实践应用,为CAD二次开发提供了有价值的参考。

    50个老鸟常去的C源代码网站

    本文将详细解析并归纳“50个老鸟常去的C源代码网站”中提及的精选网站,为读者提供一个全面的资源指南,涵盖从学习资料到专业项目开发所需的各种C/C++源代码。 1. **DZone Snippets ...

    别样诠释:一个Visual C++老鸟10年学习与开发心得

    《别样诠释:一个Visual C++老鸟10年学习与开发心得》是关于资深开发者在Visual C++领域的深入探索和实践经验的总结。通过这个标题,我们可以了解到这是一本聚焦于Visual C++编程语言,尤其是从长期实践者的角度出发...

    老鸟程序员才知道的 40 个小技巧

    以下将详细解读这40条“老鸟程序员才知道的小技巧”,并尽可能全面地挖掘其中的知识点。 1. 重构是程序员的主力技能:重构,即对软件代码进行结构上的优化而不改变其外部行为的过程,是程序员提高代码质量的重要...

    6软件编程出生的我们毕业后该何去何从?来听听老鸟的建议

    #6软件编程出生的我们毕业后该何去何从?来听听老鸟的建议

    Java入门1·2·3:一个老鸟的Java学习心得.rar 超清

    《Java入门1·2·3:一个老鸟的Java学习心得》适合广大想学习一门编程语言的读者、没有任何基础的Java入门读者、Java自学人员、从其他语言转向Java语言的读者、大中专院校的学生和社会培训学生。

    Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka

    Java面试题+Java并发编程(J.U.C)+Java8实战+Redis+kafka Java 『必看』2021 版最新Java 学习路线图(持续刷新):+1::+1::+1: Java入门面试题 Java基础入门80问,适合新手,老鸟直接跳过 Java并发编程(J.U.C) ...

    一个老鸟对java抽象类的总结

    此资源纯属本人键盘敲击拍打而来,献给乐于分享热爱Java编程的人

    别样诠释 一个Visual C++老鸟10年学习与开发心得

    别样诠释 一个Visual C++老鸟10年学习与开发心得

    C语言经典100例-100个例子让你菜鸟变老鸟

    根据给定文件的信息,我们可以提炼出四个C语言编程示例的关键知识点,这些示例旨在帮助初学者提升C语言技能。 ### 第一个示例:生成不同的三位数组合 **描述**: 此程序的目标是生成所有可能的三位数组合,其中三...

    十年老鸟VC++开发,别样诠释代码光盘资源

    《十年老鸟VC++开发,别样诠释代码光盘资源》是一本专为初学者设计的VC++编程书籍,由一位拥有十年经验的资深开发者编著。这本书的独特之处在于,它不仅提供了详尽的理论知识讲解,还通过附带的光盘资源帮助读者避免...

    LABVIEW学习由基础到老鸟

    本压缩包包含了丰富的“综合资源”,涵盖了LabVIEW的基础概念、编程技巧以及实际应用案例。 LabVIEW,全称Laboratory Virtual Instrument Engineering Workbench(实验室虚拟仪器工程工作台),是一款图形化编程...

    高质量C++编程(一本非常不错的书)

    对于计算机,也许你是老鸟,也许你是菜鸟…… 但不管怎样,如果你此时此地你要学习编程,那么你应该多多少少知道点什么叫硬件什么叫软件——反正我不管你懂不懂,为了面子,我很不乐意你问我什么叫硬件什么叫软件...

    Java入门1·2·3:一个老鸟的Java学习心得

    一个老鸟的Java学习心得 -- 1·2·3

    Java入门1·2·3——一个老鸟的Java学习心得 高清pdf

    第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP编程、Java UDP编程、Java Swing编程、JDBC编程,最后还给出了一个聊天程序实例和一个数据表操作窗口实例,将Swing、UDP、...

    Java入门1·2·3——一个老鸟的Java学习心得

    资源名称:Java入门1·2·3——一个老鸟的Java学习心得内容简介:本书是一本与众不同的Java入门好书。作者以独特的视角,向Java初学者讲述了如何才能真正理解和掌握Java语言。本书充分考虑了初学Java语言的种种困难...

    JavaScript 核心教程 从菜鸟到老鸟

    了解函数表达式和函数声明的区别,以及闭包的概念,对于提升编程技巧至关重要。而箭头函数的引入,简化了函数定义的语法,是ES6新增的重要特性。 接下来,深入学习对象和原型。JavaScript的万物皆对象,每个对象都...

Global site tag (gtag.js) - Google Analytics