Maxiee的Vim入门日记(6)——用Vim看aMule代码2

昨天在 Maxiee的Vim入门日记(5)——用Vim看aMule代码 里,Maxiee分析了wxSingleInstanceChecker这个类型,从中感受到了Vim强大的功能,看代码效率确实提高很多!今天Maxiee继续分析amule.h文件,因为里面的宏定义安排的很巧妙,值得学习。
 
打开amule.h,往下翻一点,就会遇到一块宏定义:
 
Maxiee的Vim入门日记(6)——用Vim看aMule代码2_第1张图片
 
这个块的逻辑是,如果定义了AMULE_DEAMON,就让AMULE_APP_BASE代表wxAppConsole;如果没有定义呢,就让AMULE_APP_BASE代表wxApp。同时,一个似乎叫核心定时器周期宏也代表这不同的值。
 
这个AMULE_DEAMON到底是什么呢?DEAMON这个词,Maxiee在鸟哥的私房菜里看到过,叫守护进程,就是在后台运行的。
 
昨天就已经查到过,aMule采用一套代码,可以编译出功能不同的多个软件:
  • amule(伺服器/用户端)- aMule 的 桌面程式
  • amuled(伺服器)- 后台程序,可配合 amulecmd 或 amulegui 使用
  • amulegui(用户端)- 在图形介面下使用
其中这个amuled,不就是amule deamon嘛!所以说,要编译后台运行的deamon,我们就采用这个定义就好。
 
照这么说,amule和amulegui也会有相应的宏了?Maxiee赶紧在Vim里往下翻:
 
Maxiee的Vim入门日记(6)——用Vim看aMule代码2_第2张图片
 
立刻又碰到了这么一块宏:通过宏定义的不同,IsDeamon和IsRemoteGui这两个函数的内容也会不同!宏定义真是个巧妙啊。Maixee仔细分析看:
开头有注释“Who am I”,我是谁?是说要编译的是哪种程序。
IsDeamon():我是不是Deamon呢?
如果定义了AMULE_DEAMON,那我就回答说是
否则,我就说我不是Deamon
IsRemoteGui():同理
如果定义了CLIENT_GUI,那我就是纯GUI程序
否则,我就不是
有了Deamon,有了Remote GUI,那么amule呢?最关键的怎么没了?
两个都不是,那不就是amule嘛!
……
 
amule最基本的类是CamuleAppCommon,不管是Deamon、Gui还是amule,都要继承它,这三个程序因为功能不同,还各自实现了各自的类,用了C++的多重继承,最终,这三个类是这样的:
 
Maxiee的Vim入门日记(6)——用Vim看aMule代码2_第3张图片
 
(这个位于amule-remote-gui.h中)
Maxiee的Vim入门日记(6)——用Vim看aMule代码2_第4张图片
 

 
Maixee发现,这三者都有DECLARE_APP(XXXX),在wxWidget中,这是一个宏,大概是指定程序运行时执行的类。下面还有一个指针,不论我们编译的是哪种类型,theApp都代表当前的程序。
 
通过宏定义,amule就能用一套程序,编出三个执行程序来,很巧妙,Maxiee今天又学了一招哈O(∩_∩)O~~

你可能感兴趣的:(vim,aMule)