首先來說明一下freenos的目錄:
freenos的一級目錄如下
bin目錄下存放的是freenos各個服務的main.cpp
config顧名思義存放的就是freenos的配置檔案了
kernel存放的是freenos的核心的原始碼
lib下面存放的是freenos自己封裝的一些基礎類,對於c++初級的學者來說這塊相對來說簡單,而且能夠學到的技巧也多,lib下面作者根據功能分類了很多個目錄,在這裡我就不一一枚舉了,
server存放的也是freenos的服務,至於和bin有什麼區別,等待後面的學習更新
support存放的是文件和python指令碼,至於這些指令碼是用來幹什麼的目前還不清楚
test存放的是對freenos的測試的**下面我們步入正題,這次我們要學習的是freenos中的模組下面是freenos中日誌模組的標頭檔案
/**
* logging utilities and definitions.
* * @author niek linnenbank
* @date 5 march 2015
*/#ifndef _log_h
#define _log_h
#include "singleton.h"
#include "macros.h"
#include "string.h"
/** * output a log line to the system log (syslog).
* * @param type log level
* @param typestr log level string
* @param msg message to output
*/#define make_log(type, typestr, msg) \
/** * output a critical message and terminate program immediatly.
* @param msg the critical message.
*/#define fatal(msg) make_log(log::emergency, "emergency", msg)
/** * output an error message.
* @param msg the error message.
*/#define error(msg) make_log(log::error, "error", msg)
/** * output a warning message.
* @param msg the warning message.
*/#define warning(msg) make_log(log::warning, "warning", msg)
/** * output a notice message.
*/#define notice(msg) make_log(log::notice, "notice", msg)
/** * output a regular message to standard output.
*/#define info(msg) make_log(log::info, "info", msg)
/** * output a debug message to standard output.
* * @param msg the message to output
*/#define debug(msg) make_log(log::debug, "debug", msg)
/** * logging class.
* * @note this class is a singleton
*/class log : public singleton;
/*** constructor.
*/log();
/*** destructor
*/virtual ~log();
/*** get the minimum logging level.
*/level getminimumloglevel();
/*** set the minimum logging level.
*/void setminimumloglevel(level level);
/***/
/*** set log identity.
*/void setident(const char *ident);
/*** retrieve log identify.
*/const char * getident();
protected:
/*** write to the actual output device.
*/virtual void write(const char *str) = 0;
private:
/** minimum log level required to log. */
level m_minimumloglevel;
/** identity */
const char *m_ident;
/** buffered output */
string m_outputbuffer;
};/**
* @name operators to output various standard types to the log
* @*/#endif /* _log_h */
1. 單例模式
一般在程式中日誌模組都只初始化一次,在freenos中我們可以看到他的日誌模組設計是繼承自乙個單例的模板類,這也是我們值得學習的地方,freenos的作者將單例模式進行抽象,定義為乙個模板類,這樣在整個工程中,只要需要單例模式的地方繼承自這個單例的模板類就可以了,大大的減少了**的重複性。
template class singleton
/** one and only instance. */
static t *instance;
};/* initialize the static member obj. */
template t* singleton::instance = 0;
2. 巨集函式的替換
一般在列印日誌的時候都需要設定日誌需要列印的級別,freenos的作者在這塊巧妙的利用巨集函式替換的策略,針對不同級別的日誌對make_log函式進行替換,把make_log函式的前兩個引數謝偉固定的,這樣在使用日誌的時候我們根據需要記錄的日誌級別選用對應級別的巨集函式就可以,好處是只需要傳乙個引數,而且根據函式名就可以知道使用處日誌的級別。
/**
* output an error message.
* @param msg the error message.
*/#define error(msg) make_log(log::error, "error", msg)
3.類的設計
在freenos中log類是所有日誌類的基類,write函式是乙個純虛函式,log類的析構函式為虛析構函式,所有繼承自log類的子類,只需要實線write函式即可
4.《操作符的過載
學習學習再學習
如果乙個技能足夠複雜 比如從零學程式設計 那就不要指望讀完一本書就可以打天下。多買幾本書同類的書 因為每個作者的出發點是不一樣的,哪怕對同乙個概念都有不同的解釋說明。理解知識的重要過程之一就如牛的反芻一樣,要嚼一遍 嚥下去 再吐出來 再嚼一遍 再嚥下去 所以,既然一本書可以讀幾遍,那麼同一話題多應該...
學習 學習 再學習
原本要使用vs2005開發乙個b s專案的,沒有想到只能先暫時停停了,居然跟不上技術的發展了,呵呵,一直使用delphi delphi也沒能跟上 沒有想到轉到vs2005上竟然有這麼多要學的東西,當然目的是了做乙個好的系統。最近一直在學習asp.net ajax,雖然專案停了,但是我覺得值得,有很多...
只是學習 學習 再學習
通過做 讓我學會了很多東西 什麼 flash div css html js as 雖然都只是皮毛 不過 算是了解那麼一點點吧 哈哈 我還突然發現 我的 數學和英語 進步了不少 而且還都是很實用的 比在學校的進步可快多了 那句話說的很不錯 在你了解了一些皮毛之後你會發現很多東西你都必須去學。因為少一...