• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            martin

            thinking

            常用鏈接

            統(tǒng)計

            software

            最新評論

            C++程序中的跟綜方法

            在應(yīng)用開發(fā)構(gòu)成中,我們經(jīng)常在程序中加入一些打印語句,來對程序的執(zhí)行流進(jìn)行跟蹤.在C或C++中可以利用下列語句來實(shí)現(xiàn):
            (1)
            printf("enter %s\n",(char *)funcName);
            cout<<"enter "<< s_funcName << endl;
             
            但這樣處理有點(diǎn)不足,就是該語句只輸出到標(biāo)準(zhǔn)輸出上,我有時希望這些輸出被定向到特定文件,輸出成日志.為此,我們可以把這些函數(shù)進(jìn)行包裝,把輸出流ostream(標(biāo)準(zhǔn)輸出或文件輸出)作為包裝函數(shù)的一個參數(shù):
            (2)
            printWrap(ostream out,format, args);
            注:此處的args, format表示要輸出的參數(shù)和相應(yīng)的參數(shù)格式.
            當(dāng)然我們還可以對它進(jìn)行進(jìn)一步的改進(jìn):在該函數(shù)中,加入預(yù)定以的符號常量__LINE__(當(dāng)前源代碼行的行號,為整數(shù)常量),__FILE__(假定的源文件名,某個字符串).這樣我們可以知道程序運(yùn)行到了那個源文件,并且那一行.
             
            現(xiàn)在(2)中的處理方式比(1)中處理方式已經(jīng)有明顯的改善了.
            但這種方式還稍微有點(diǎn)不足.當(dāng)我們想要跟蹤一個函數(shù)的執(zhí)行,即知到執(zhí)行流進(jìn)入某函數(shù),何時離開某函數(shù)時,這種處理方式有點(diǎn)不足.每個函數(shù)都有一個入口,但可能有多個出口,這樣就需要在每個入口和出口處加上printWrap(ostream out,args)語句,并且在C++中,當(dāng)執(zhí)行流遇到異常退出該函數(shù)時,可能有些printWrap語句并沒有被執(zhí)行,從而沒有輸出記錄.
             
            為此,我們可以對(2)進(jìn)行進(jìn)一步改進(jìn).我們可以設(shè)計一個類,在該類對象的構(gòu)造函數(shù),析構(gòu)函數(shù)中進(jìn)行輸出.在函數(shù)的入口處,調(diào)用對象的構(gòu)造函數(shù)進(jìn)行輸出;在函數(shù)的出口處,或異常退出時,調(diào)用對象的析構(gòu)函數(shù)進(jìn)行輸出.
            我們可以把該類簡單總結(jié)如下:
            (3)
            class Trace{
                public:
                            Trace(int iDebugLevel,ostream out, format,args) { cout <<"Hello\n";}
                            ~Trace() { cout << " Goodby\n";}
                               int getDebugLevel();
                private:
                        ...
                         int    iDebugLevel;
                         ostream m_out;
            };
             
            注:  我們可以用printWrap(..)替換cout << ....。printWrap中的輸出流在Trace的構(gòu)造函數(shù)中傳到Trace實(shí)例中,并被保存。
             
            我們還可以對它進(jìn)行一點(diǎn)改進(jìn),以提高它的性能。因?yàn)椴捎蒙厦娴膶ο蟆t每次都會進(jìn)行輸出或進(jìn)行日志記錄.我們可以通過構(gòu)造函數(shù)在Trace的實(shí)例中,設(shè)置一個iDebugLevel變量和ostream。并在系統(tǒng)中設(shè)置一個統(tǒng)一的debugLevel.在每次進(jìn)行輸出時進(jìn)行iDebugLevel, debugLevel比較,如果iDebugLevel <= debugLevel, 則進(jìn)行輸出,否則則不進(jìn)行輸出.
             

            posted on 2009-03-03 14:50 martin_yahoo 閱讀(125) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            无码任你躁久久久久久久| 精品久久香蕉国产线看观看亚洲| 久久久久亚洲AV综合波多野结衣 | 99久久免费国产精精品| 国产69精品久久久久777| 国产精品成人99久久久久| 久久综合日本熟妇| 亚洲AV无码久久精品成人 | 精品久久久久久无码人妻热| 久久天天躁狠狠躁夜夜不卡| 亚洲人成伊人成综合网久久久| 久久久久久久久久久久中文字幕 | 日韩精品久久无码人妻中文字幕| 国产成人久久精品一区二区三区| 99久久精品免费看国产一区二区三区| 亚洲国产成人乱码精品女人久久久不卡 | 久久无码中文字幕东京热| 成人久久综合网| 中文精品久久久久人妻| 久久国产精品99久久久久久老狼| 久久天天躁狠狠躁夜夜2020| 狠狠色丁香久久婷婷综| 亚洲精品乱码久久久久久蜜桃图片 | 久久久久亚洲av无码专区喷水| 久久久久久噜噜精品免费直播 | 99国产精品久久| 7777精品久久久大香线蕉| 国产精品日韩深夜福利久久 | 精品久久久久久中文字幕| 人妻无码精品久久亚瑟影视| 激情五月综合综合久久69| 99久久婷婷免费国产综合精品| 久久亚洲精品成人无码网站 | 国内精品免费久久影院| 久久人爽人人爽人人片AV| 久久久久青草线蕉综合超碰| 久久久久国产一区二区三区| 国产精品成人无码久久久久久 | 久久午夜福利电影| 激情综合色综合久久综合| 国产亚州精品女人久久久久久 |