<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Crest的語法---宏的魔術匯演

      上文完成了用純C語言描述一個簡單的對象結構的工作,因為要用例子表現,所以這次我們要來設計一下Crest的語法,也就是要看一下如果Crest最終能夠成功完成的話,我們的編程代碼會是一個什么樣子。

      最理想的面向對象語法當然是仿造C#、java這樣的結構了,但是因為C語言要用頭文件,所以估計最終的樣式還是類似于C++。首先我們還是制定一個目標的樣式,然后再去用Crest仿造實現。目標是這樣的[代碼1]:

      class CString: CObject, IUnknown, IDispatch
      {
       int length;
       char * buffer;
       
       public virtual void Format(char * format)
       {
       DoFormat(format);
       }
       
       public void DoFormat(char * format)
       {
       if( OnFormat != null ) OnFormat(format);
       }
       
       public abstract void OnFormat(char * format);
      }

      要想用Crest實現上面的結構,有幾個問題要注意:

      1. this指針。所有的對象成員定義和調用都隱含有一個this指針
      2. 命名規范,CString的Format和CDateTime的Format肯定不是同一個東西,但是C語言不支持override,所以要保證成員函數不重名。

      經過兩天的斷斷續續工作,最終呈現結果如下[代碼2]:

      DECLARE_CLASS(CString)
       EXTENDS(CObject, IMPLEMENT2(IUnknown,IDispatch))
       
       DECLARE_FIELD(CString, int, length)
       DECLARE_FIELD(CString, char *, buffer)
       
       DECLARE_VIRTUAL1(CString, void, Format, const char * format)
       DECLARE_ABSTRACT1(CString, void, OnFormat,const char * format)
       
       DECLARE_METHOD1(CString, void, DoFormat,const char * format)
       
       DECLARE_CONSTRUCTOR(CString)
       DECLARE_DESTRUCTOR(CString)
      END_DECLARE(CString);

      這個風格是不是覺得有些累贅?bigtall開始也覺得不滿意,但是后來發現借助C語言的Macro魔法,這樣的結構反而是最簡單的,或者說,比較爽!

      在最終演化到這個樣子的代碼風格之前,我們可以手工來實現一個不用macro的版本,有對比才有真相??!我們還是參考(代碼1)部分,根據我們上文得到的經驗,可以很輕松把代碼給出來[代碼3]:

       
      struct Class_CString; 
      typedef struct Class_CString CString;
      void CString_Format (CString *self, const char * format);
      void CString_OnFormat (CString *self, const char * format);
      void CString_DoFormat (CString *self, const char * format);
      void CString_constructor (CString *self);
      void CString_destructor (CString *self);
       
      struct Class_CString{
       int length;
       char * buffer;
       void (*Format) (CString *self, const char * format);
       void (*OnFormat) (CString *self, const char * format);
      };
       

      多了好多東西,寫起來很麻煩,如果我們以后增加更多的特性的話,恐怕會成為噩夢。Crest要想讓別人也去用,語法上面一定要讓人覺得“合算”---增加一定的繁瑣,但是得到的有用特性更多。為了實現(代碼2)到(代碼3)的轉換,我們來看一下實際(代碼2)的頭文件定義:

       /* filename: macropure.h */
      #if defined(DECLARATION) || defined(DEFINITION)
       
      #include "CrestMacro.h"
       
      DECLARE_CLASS(CString)
       .../*此處省略*/
      END_DECLARE(CString);
       
      #else
       #define DECLARATION
       #include "macropure.h"
       #undef DECLARATION
       
       #define DEFINITION
       #include "macropure.h"
       #undef DEFINITION
      #endif
       
      這里bigtall使用了大量的宏定義,而且用了一個很少用的特性:自己包含自己。通過自身的包含,結合#if..#else..#endif,我們實現了不同階段的DECLARE_CLASS有不同的定義。這樣做的結果就是寫一次繁瑣的定義,通過宏的轉換,實現了完整的class的定義代碼。這里可惜的是,要是#include也支持宏擴展的話,頭文件可以更簡單。另外bigtall還做了一個用cpp32預處理再包含.i文件的版本,因為可移植性的問題,否掉了。
       
      以上講的是.h頭文件,對于.c文件,Crest的代碼是這樣的:
      #include <stdio>
      #include "macropure.h"
       
      IMPL_VIRTUAL1(CString, void, Format, const char * format)
      {
       REF_METHOD(CString, DoFormat)(self, format);
      }
       
      IMPL_ABSTRACT1(CString, void, OnFormat,const char * format)
      {
       puts(format);
      }
       
      IMPL_METHOD1(CString, void, DoFormat,const char * format)
      {
       if( self->OnFormat != 0 )
       self->OnFormat(self, format);
      }
       
      IMPL_CONSTRUCTOR(CString)
      {
       self->length = 3;
       self->buffer = "abc";
       self->Format = REF_METHOD(CString, Format);
       self->OnFormat = REF_METHOD(CString, OnFormat);
      }
       
      IMPL_DESTRUCTOR(CString)
      {
      }
       
      void main()
      {
       CString str, *pStr;
       
       CONSTRUCT(CString, &str);
       NEW(CString, pStr);
       
       str.Format(&str, "abcdefg\n");
       pStr->Format(pStr, "cdefghijk\n");
       
       DELETE(CString, pStr);
       DESTRUCT(CString, &str);
      }

       

      上一篇:Crest簡單對象的設計 (to be continue)

      posted on 2009-12-01 11:23  老翅寒暑  閱讀(1703)  評論(1)    收藏  舉報

      導航

      主站蜘蛛池模板: 欧美人与禽2o2o性论交| 超碰伊人久久大香线蕉综合| 久热这里有精品免费视频| 精品国产成人亚洲午夜福利| 婷婷四虎东京热无码群交双飞视频| 久久精产国品一二三产品| 亚洲成人av一区二区| 欧美国产精品不卡在线观看| 中文字幕免费不卡二区| 亚洲精品国产无套在线观| 99在线视频免费观看| 久久人人爽爽人人爽人人片av| 久热久热免费在线观视频| 亚洲第一无码AV无码专区| 曰韩无码二三区中文字幕| 成人一区二区三区在线午夜| 成熟少妇XXXXX高清视频| 西西人体大胆444WWW| 豆国产97在线 | 亚洲| 91产精品无码无套在线 | 少妇人妻互换不带套| 精品人妻中文字幕av| 无码人妻丝袜在线视频| 比如县| 亚洲中文字幕人妻系列| 国产精品亚洲一区二区三区喷水| 中文字幕日韩有码一区| 久久国产精品色av免费看| 少妇厨房愉情理9仑片视频| 国产精品亚洲综合一区二区| 精品国产乱子伦一区二区三区| 成人国产精品中文字幕| 国产精品夜夜春夜夜爽久久小说| 偷拍久久大胆的黄片视频| 欧美肥妇毛多水多bbxx| 天天做天天爱夜夜夜爽毛片| 67194熟妇在线观看线路| 日本伊人色综合网| 性色av一区二区三区精品| 又色又污又爽又黄的网站| 亚洲www永久成人网站|