青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

清風竹林

ぷ雪飄絳梅映殘紅
   ぷ花舞霜飛映蒼松
     ----- Do more,suffer less

Solmyr 的小品文系列之九:次序問題

“zero 幫幫忙吧 ~~ ”

聽到這個充滿誠意的聲音,zero 垮下了雙肩,感覺自己處于徹底崩潰的邊緣 ———— 幾個月來,每次 pisces 遇到什么不能解決的問題,總是用這個開場白來求 zero,而后 zero 就不得不面對各式各樣匪夷所思的古怪問題。

“她怎么就能弄出那么多錯誤來呢?” zero 在心中哀嘆。他苦著臉,問道:“你就不能放過我去找 Solmyr 么?”

“可是 Solmyr 指定你來幫助我們的呀!”

“ …… 好吧,說說是什么問題”,zero 一邊在心里再次痛罵了 Solmyr 一百遍,一邊做好了再次面對奇怪錯誤的準備。

“嗯,這里有一段代碼,是讀取配置文件信息的。現在只是個框架,將來可能需要讀好些配置文件,而且可能放在不同目錄下,所以這里我用一些 string 對象保存路徑和文件名,然后用 fopen 打開。” 說著,pisces 調出了一個 cpp 文件:

#include <cstdio>
#include <string>
#include "config.h"    // 頭文件,定義了存放配置信息的結構
                              // 并包含 read_cfg 函數的聲明

using namespace std;

const string path = "./cfg/";
const string name = "system.cfg";

// 參數為指向保存配置信息結構的指針
// 返回值為成功標志,true 代表成功,false 代表失敗
bool read_cfg(CFG_DATA* p_data)
{
   const string path_name = path+name;
   FILE* fp = fopen(path_name.c_str(), "r");
   if( fp == NULL )
       return false;

   // 使用 fp 讀取配置文件,放入 CFG_DATA 結構
   ... ...
   ... ...

   return true;
}

... ....

“在我這里運行的好好的,但提交給測試組做單元測試的時候卻總是出毛病,說是找不到配置文件,我去他們那里看過了,配置文件的名字和路徑都是對的呀,真是太奇怪了。”

zero 斜著眼看了看這段代碼,對其中的風格大為不滿:“我說 pisces,錯誤先不提,你這段代碼的風格實在不太象 C++ 啊。首先參數應該用引用,它的安全性可比指針高多了,而且你既然用了指針,就應該用斷言做檢查么;其次你干嗎不用流來讀取文件呢?非要用 fopen ……”

“我知道我知道!” pisces 忙不迭的打斷了 zero,“我知道這里我的風格不太好,可是無論怎樣這段打開文件的代碼應該沒錯呀?可現在問題是打開文件的時候出錯,明明文件在那兒的,可函數總是返回 false 。幫我先把這個 bug 找出來嗎,幫幫忙了 ~~~~~ ”

“好好!”,zero 搖了搖頭,開始尋找錯誤。5 分鐘過去,zero 的眉頭漸漸皺了起來,這段只有三五行的代碼看起來一目了然,根本沒有隱藏錯誤的地方。zero 把這段代碼引進他用來測試的工程里,編譯連接,測試運行,程序一切正常,正確的找到了配置文件。這是怎么回事?zero 迷惑了。

“zero?” pisces 將探詢的眼光投向 zero。“呃 …… 別急,我們去測試組那里看看究竟怎么回事。” zero 心存僥幸,沒準是測試組弄錯了呢?10 分鐘之后,zero 垂頭喪氣的回來了,后面跟著 pisces。測試組沒有弄錯,在他們那里這段代碼確實不能正常工作,調試器顯示,作為文件名傳入 fopen 的是個空字符串。這是怎么回事?zero 一邊想著,一邊往自己的座位走去 ———— 哎?那個站在自己計算機前的人不是 …… 不是 …… Solmyr 么?他手上拿的是 ……

zero 本能的感到了危險,猛的一偏頭!一個文件夾從離他的臉只有 0.01 公分的地方唰的一下擦了過去!可惜后面的 pisces 就沒有這么幸運了,被打個正著!

Solmyr 看了一眼正捂著臉的 pisces,對嚇出一身冷汗的 zero 問道:“屏幕上那段代碼不是你寫的吧?”

“對,是她寫的。” zero 同情的看了看 pisces ,后者好象還沒有從打擊中恢復過來 ……

“有因就有果,真是一點也不會錯啊 ……” Solmyr 聳聳肩,“知道這段代碼為什么會出錯么?”

zero 苦笑:“不知道。”

“把眼光放開一點,你看一下調用這個函數的地方就知道了。”

zero 調出了整個工程。按照文檔上的說明,read_cfg 是整個系統初始化過程的步驟之一,當系統啟動時會讀取配置文件確定一些初始化的參數。據此,zero 很容易的找到了調用處,在另外一個 cpp 文件中:

#include "config.h"    // 其中聲明了 read_cfg 這個函數

class system
{
public:
   // 完成系統啟動時的初始化工作
   system()
   {
       CFG_DATA data;
       read_cfg(&data);

       // 使用 data 中的信息配置系統
       ... ...
   }

   // 完成系統退出時的清理工作
   ~system()
   {
       ... ...
   }

   ... ...
};

system theSystem;    // 代表整個系統的全局對象

Solmyr 清了清嗓子:“這是個看起來很干凈的手法。system 這個類只有這里一個全局對象,這個全局對象代表了整個系統,它構造,系統做初始化工作;它析構,系統開始做退出時的清理工作。全局對象的身份保證了它會在 進入 main 函數之前構造,在 main 函數退出之后析構。這一招是你教 pisces 的吧?”Solmyr 看了看 zero 。

zero 點點頭:“沒錯,上次她問我如何能夠比較好的處理初始化和清理的代碼,我想起了上次關于‘成對出現 ’的討論(注一),就給她出了這個主意。”

“思路是對頭的,但是實現的方式不妥,毛病就出在全局對象上面。我問你,一個 cpp 文件,或者說得正式一點,一個編譯單元中的全局對象構造析構的順序是怎樣的?”

“ …… 應該是按照定義它們的順序。” zero 努力的回憶一陣,很肯定的說道。

“正確,那么不同編譯單元之間全局對象的構造順序呢?”

“ …… 好象沒有明確的規則,這個應該屬于標準未定義對吧?”

“正確,所以 ……”

“所 以 …… …… 啊!我明白了!哎呀!我怎么這么遲鈍!看到 fopen 傳入的是空字符串的時候我就應該想到的!” zero 露出了恍然大悟的表情,“在打開配置文件的代碼段中,保存文件名的 path 和 name 也是全局對象,換句話說,這兩個 string 對象和 theSystem 對象的構造次序是無法確定的。在測試組那里,theSystem 先于 path 和 name 構造,所以當 theSystem 的構造函數調用 read_cfg 函數的時候,path 和 name 這兩個 string 對象根本還沒有來得及構造!當然無法取出文件名和路徑來!而在我和 pisces 的計算機上,構造次序與之相反,這段代碼就可以正確運行。”

“很好,那么如何解決呢?”

“嗯 …… …… 我想只要盡可能避開全局對象就行了,一方面 theSystem 這個對象可以放到 main 函數里,一樣可以保證正確完成初始化工作和清理工作;另一方面,read_cfg 那邊最好也不要用全局的 string 對象了,一樣可以用局部對象。這樣是能夠解決這個問題 ……” zero 皺起了眉頭,顯然對這個解法還不太滿意,“那如果我有一些全局性質的對象,而且希望精確的定義它們的構造次序,該怎么辦呢?”

Solmyr 點了點頭:“沒錯,有時候這確實是個合理的要求。對此最簡單的解法是‘被函數包裝的 static 對象’(注二),象這樣:”

system& theSystem()
{
   static system instance;
   return instance;
}

“instance 是個 static 對象,這保證了它的生存期,然后它會在第一次調用這個函數的時候構造。針對你的問題,只要你聲明多個這樣的函數,然后保證它們第一次調用的次序,就可以保證這些對象構造的次序了。”

zero 若有所思的點了點頭。

“說 起來,次序問題絕對不只這一個,C++ 中類似的問題相當多。和這個問題最接近的,是類的成員和基類的構造次序,其他的還有表達式求值的次序、函數參數求值的次序,(注三)等等。遇到次序問題, 千萬不要想當然,問自己一句:這個次序有定義嗎?有定義的要遵守,無定義的要避開。好了,這個問題大概就是這樣,接下來你的任務是 …… ”

“我知道,把這些討論整理成文檔對吧?”

“不,是想辦法讓 pisces 搞懂這個問題。”

“…… …… …… …… …… ……”

望著 Solmyr 甩手匆匆離去的背影,再看看身邊正用最拿手的“誠懇”眼神看著自己的 pisces ,zero 突然泛起了一種奇怪的感覺:好象以前只是單純被 Solmyr 砸的日子也沒有那么糟糕 …… …… ……

posted on 2009-08-19 12:03 李現民 閱讀(482) 評論(0)  編輯 收藏 引用 所屬分類: 絕對盜版

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲香蕉网站| 欧美日韩中文字幕日韩欧美| 亚洲国产一区二区三区在线播| 亚洲区欧美区| 亚洲精品小视频在线观看| 久久精品在线播放| 性欧美大战久久久久久久久| 午夜精品区一区二区三| 欧美一区二区视频在线| 欧美在线观看一二区| 久久视频一区二区| 亚洲高清一二三区| 亚洲黄色成人久久久| 亚洲视频香蕉人妖| 欧美专区18| 欧美精品v日韩精品v韩国精品v| 欧美日本韩国| 国产精品一区二区久久久久| 国内精品久久久久伊人av| 在线观看欧美| 中文在线资源观看网站视频免费不卡 | 日韩午夜激情av| 亚洲一区二区三区色| 久久精品欧美日韩| 欧美视频精品一区| 亚洲国产成人av| 亚洲一区免费视频| 欧美高清在线视频观看不卡| 亚洲一级片在线观看| 蜜臀99久久精品久久久久久软件 | 欧美日韩日本网| 国产一区激情| 亚洲欧美激情四射在线日| 欧美mv日韩mv国产网站app| 宅男精品视频| 久久综合九色九九| 亚洲精品裸体| 看欧美日韩国产| 国产欧美一区二区精品忘忧草| 日韩视频免费在线| 欧美刺激午夜性久久久久久久| 亚洲综合99| 欧美午夜理伦三级在线观看| 亚洲美女黄网| 亚洲第一毛片| 欧美va亚洲va香蕉在线| 精品成人一区| 久久婷婷影院| 欧美一区二区精美| 国产乱码精品| 性xx色xx综合久久久xx| 在线中文字幕一区| 国产精品国产精品| 亚洲午夜伦理| 一区二区三区日韩欧美| 欧美三级电影一区| 一区二区三区色| 亚洲精品1234| 欧美精品v日韩精品v国产精品| 亚洲人被黑人高潮完整版| 麻豆精品精华液| 欧美在线一二三区| 国产亚洲二区| 久久综合久色欧美综合狠狠| 欧美一级播放| 一区二区三区在线视频免费观看| 久久久久久夜精品精品免费| 欧美一区不卡| 亚洲高清一区二| 欧美激情一区二区三区在线视频观看| 欧美在线亚洲在线| 亚洲国产精品va在线看黑人动漫 | 亚洲伊人一本大道中文字幕| 日韩视频精品| 国产精品美女久久| 久久精品99| 六十路精品视频| 日韩亚洲一区在线播放| 一区二区三区www| 国产精品午夜在线| 久久一区欧美| 欧美精品激情在线| 性做久久久久久久久| 久久精品国产免费观看| 亚洲黄色av一区| 亚洲人久久久| 国产精品视频网址| 欧美成人免费在线| 欧美日韩一区二区三区高清| 午夜久久美女| 久久人人超碰| 亚洲无线视频| 久久亚洲国产成人| 亚洲一区3d动漫同人无遮挡| 欧美亚洲自偷自偷| 一区二区三区四区精品| 久久av一区二区| 噜噜噜噜噜久久久久久91| 亚洲视屏在线播放| 久久精品二区三区| 亚洲影院在线| 另类图片国产| 欧美中在线观看| 美国成人直播| 西瓜成人精品人成网站| 麻豆成人在线观看| 欧美与黑人午夜性猛交久久久| 久久人体大胆视频| 亚洲宅男天堂在线观看无病毒| 欧美一区二区三区在| 洋洋av久久久久久久一区| 欧美一区二区日韩一区二区| 99视频在线观看一区三区| 久久精品综合一区| 欧美一区二区高清在线观看| 欧美高清在线观看| 久久综合狠狠综合久久综合88| 欧美午夜国产| 欧美国产日本在线| 国产一区二区成人| 亚洲制服少妇| 亚洲免费在线视频一区 二区| 免费观看成人| 猫咪成人在线观看| 国产农村妇女精品一二区| 日韩写真在线| 亚洲毛片在线观看| 欧美成人国产| 欧美高清成人| 在线观看视频一区二区| 欧美一区二区高清在线观看| 午夜精彩国产免费不卡不顿大片| 欧美精品一区二区三区在线看午夜| 久久久久久伊人| 国语对白精品一区二区| 欧美一区二区三区免费大片| 欧美亚洲综合另类| 国产精品海角社区在线观看| 99re6这里只有精品视频在线观看| 亚洲国语精品自产拍在线观看| 久久视频国产精品免费视频在线| 久久久亚洲国产天美传媒修理工| 国产视频精品免费播放| 香蕉久久夜色| 久久精品中文字幕一区| 国产欧美一区二区白浆黑人| 午夜亚洲福利| 久久天天躁夜夜躁狠狠躁2022| 国产一区二区三区的电影 | 欧美激情在线免费观看| 亚洲丰满在线| 一本色道久久综合亚洲精品按摩 | 在线观看日韩| 美女尤物久久精品| 亚洲精品网址在线观看| 在线视频日韩| 国产精品无码专区在线观看| 久久精品免视看| 亚洲国产精品第一区二区| 亚洲福利国产精品| 欧美激情一区二区三区四区| 欧美高清视频一二三区| 最新国产の精品合集bt伙计| 欧美福利电影网| 亚洲人成免费| 午夜精品久久久久久久99水蜜桃| 国产女优一区| 欧美激情精品久久久六区热门| 亚洲精品国产精品国自产在线| 亚洲一区二区三区免费观看 | 亚洲网站视频福利| 久久精品亚洲国产奇米99| 国产一区二区丝袜高跟鞋图片| 久久综合综合久久综合| 日韩视频在线你懂得| 午夜欧美大片免费观看| 亚洲国产天堂久久国产91| 欧美日韩在线不卡一区| 性欧美xxxx大乳国产app| 激情久久五月天| 免费在线看一区| 亚洲裸体在线观看| 久久精品二区| 亚洲图片你懂的| 怡红院精品视频在线观看极品| 欧美jjzz| 久久久99精品免费观看不卡| 一区二区三区视频在线播放| 噜噜噜噜噜久久久久久91| 亚洲一区二区三区777| 亚洲精品久久在线| 国内精品嫩模av私拍在线观看 | 亚洲另类春色国产| 国产精品久久婷婷六月丁香| 久久夜色精品国产噜噜av| 亚洲视频第一页| 亚洲电影观看| 玖玖视频精品| 久久久噜噜噜久久| 亚洲视频电影在线|