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

来源:互联网 发布:温度采集仪单片机 编辑:程序博客网 时间:2024/05/16 07:58

本文来自http://blog.csdn.net/lijun84 ,引用必须注明出处!

 

本文来自我实践中以及阅读优秀开源项目的技巧手法总结。更多是从设计和代码结构技巧上考虑,希望对大家提供C编程有所帮助。

 

1开发跨平台的一种结构体实现 (说明代码提取自LCC编译器源码)

//定义跨平台的结构体.

       typedefstruct binding {

              char*name;           //标识一个平台的名子.

              Interface*ir; //跨平台的接口结构,一般声明需要跨平台的操作函数的指针和一些变量.

       }Binding;

      

       //可以先把每个平台的接口对象绑定好.

       Bindingbinds[]{

       //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编译器源码)


 

 

3,巧用联合体            (说明代码提取自LCC编译器源码)

 

 

4用通用结构体头实现COO封装(说明代码提取自Ruby源码)

 

struct RBasic的设计是为了包含由所有对象结构体共享的一些重要信息的。struct RBasic的定义如下:

struct RBasic

struct RBasic {

    unsigned long flags;

    VALUE klass;

};

flags 是个多目的的标记,大多用以记录结构体类型(比如,structRObject)。类型标记命名为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 {

       structRBasic basic;

       structst_table *iv_tbl;

      struct st_table *m_tbl;

       VALUEsuper;

};

 

structst_table是一个在ruby中到处使用的hash表,但基本上,它就是一个将名字映射为对象的表。在m_tbl中,持有这个类所拥有方法的名称(ID)与方法实体本身之间的对应关系。

 

原创粉丝点击