• <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>

            chaosuper85

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              118 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

            #

            ubuntu下vim語法著色和縮排問題的解決 2011-03-07 09:26 轉(zhuǎn)載自 javatown 最終編輯 javatown 版本號:2008.07.30 關(guān)鍵字:linux ubuntu vim vi 語法著色 語法高亮 縮進 縮排 本文的主要目的是討論記錄ubuntu下vim語法著色和縮排的方法 1。前提 安裝vim sudo apt-get install vim-full 之后,在/etc/vim下會發(fā)現(xiàn)vimrc這個文件這個是公共配置文件,修改它一般會對所有的ubuntu用戶產(chǎn)生效果。 2。語法著色 要讓語法高亮顯示,可以用如下辦法: 方法一: 去掉/etc/vim下vimrc中syntax on一句前面的注釋符號來開啟 方法二: 如果方法一失效可以編輯/etc下的profile文件,添加 export TERM=xterm-color 方法三: 拷貝語法著色示例文件 cp /usr/share/vim/vimcurrent/vimrc_example.vim ~/.vimrc 方法四: 在vim中輸入:syntax on來開啟語法著色 方法五: 直接編輯~/.vimrc文件,如果沒有就自己建立一個 然后把下面內(nèi)容加入 set autoindent set cindent set modeline set ruler set showcmd set showfulltag set showmode set smartcase set smartindent set imcmdline set previewwindow set hlsearch syntax on 一些配色方案,來自互聯(lián)網(wǎng),直接添加在vimrc文件末尾即可: colorscheme elflord "colorscheme darkblue "colorscheme evening "colorscheme murphy "colorscheme torte "colorscheme desert 3。縮進 以下內(nèi)容來自互聯(lián)網(wǎng) 1)設(shè)置(軟)制表符寬度為4: set tabstop=4 set softtabstop=4 2)設(shè)置縮進的空格數(shù)為4 set shiftwidth=4 3)設(shè)置自動縮進:即每行的縮進值與上一行相等;使用 noautoindent 取消設(shè)置: set autoindent 4)設(shè)置使用 C/C++ 語言的自動縮進方式: set cindent 5)設(shè)置C/C++語言的具體縮進方式: set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s 6)如果想在左側(cè)顯示文本的行號,可以用以下語句: set nu 7)最后,如果沒有下列語句,就加上吧: if &term=="xterm" set t_Co=8 set t_Sb=^[[4%dm set t_Sf=^[[3%dm endif
            posted @ 2011-06-18 07:25 chaosuper 閱讀(1075) | 評論 (0)編輯 收藏

            1)文件操作 vi FileName 打開文件 FileName,并將光標置于第一行首。 vi +n FileName 打開文件 FileName,并將光標置于第 n 行首。 vi + FileName 打開文件 FileName,并將光標置于最后一行。 vi + /pattern File 打開文件 File,并將光標置于其中第一個于 pattern 匹配的字符串處。 vi –r FileName 在上次正用 vi 編輯 FileName 發(fā)生系統(tǒng)崩潰后,恢復FileName。 vi File1 … Filen 打開多個文件,依次對之進行編輯。 :%!xxd 按十六進制查看當前文件 :%!xxd -r 從十六進制返回正常模式 :n1,n2 co n3 將 n1 行到 n2 行之間的內(nèi)容拷貝到第 n3 行下。 :n1,n2 m m3 將 n1 行到 n2 行之間的內(nèi)容移至第 n3 行下。 :n1,n2 d 將 n1 行到 n2 行之間的內(nèi)容刪除。 :n1,n2 w filename 將 n1 行到 n2 行之間的內(nèi)容保存到文件 filename 中 :n1,n2 w! Command 將文件中n1行到n2行的內(nèi)容作為 Command的輸入并執(zhí)行之, 若不指定 n1、n2,則將整個文件內(nèi)容作為 Command 的輸入。 :r! Command 將命令 Command 的輸出結(jié)果放到當前行。 :nr 文件> 把文件>插入到第n行 :so 文件> 讀取文件>,再執(zhí)行文件里面的命令(文件中的命令應(yīng)該都是一些ex命令) :l1,l2w 文件> 把第l1和第l2行之間的文本寫到文件>中去 :w >> 文件> 添加到文件>末尾. 也可以使用行號 :e! 重新編輯當前文件,忽略所有的修改 ·(、[、、]、)對應(yīng)顯示 % 顯示當前(、[、{ 、}、] 、)的對應(yīng)項 ) :光標移至句尾 ( :光標移至句首 }:光標移至段落開頭 {:光標移至段落結(jié)尾 ·(、[、、]、)內(nèi)數(shù)據(jù)選擇 daB 刪除{}及其內(nèi)的內(nèi)容 (在非v可視模式下) diB 刪除{}中的內(nèi)容 ab 選擇()中的內(nèi)容 ib 選擇()中的內(nèi)容( 不含() ) aB 選擇{}中的內(nèi)容 iB 選擇{}中的內(nèi)容( 不含{} ) ·語法提示與自動補齊 ★ 插入模式下的單詞自動完成 ★ 行自動完成(超級有用) ·設(shè)置ctags #ctags -f /usr/share/vim/vim63/funcs.tags -R /opt/j2sdk/src /usr/src/kernels/2.6.9-5.EL-i686 ^p 自動補齊上下文已有相近項 ^n 自動補齊~/.tags中的相近函數(shù) ^[ 顯示~/.tags中的光標下的函數(shù)的原型, 按^t退出函數(shù) :pta 函數(shù)名 預(yù)覽窗口快速打開相應(yīng)函數(shù)所在文件,并將光標定位在對應(yīng)函數(shù)的開頭 K 顯示光標下的C函數(shù)的man說明手冊 ·變量定位 gd 轉(zhuǎn)到光標下局部變量的定義處 Gd 轉(zhuǎn)到光標下全局變量的定義處 ·編譯選項 :cn 命令會把你帶到下一個出錯地點,而不考慮它在什么文件里。 :cc 命令會向你顯示當前錯誤的編譯器輸出信息; :cl 會生成一個列有項目所有錯誤的列表,以供瀏覽這些錯誤 3]光標移動 ·字符 h 光標左移一個字符。 l 光標右移一個字符。 ·字 w 或 W 光標右移一個字至字首。 B 或 b 光標左移一個字至字首。 E 或 e 光標右移一個字至字尾。 ·句} 光標移至句尾。 ( 光標移至句首。 ·段) 光標移至段落開頭。 { 光標移至段落結(jié)尾。 ·行k 或 Ctrl+p 光標上移一行。 j 或 Ctrl+n 光標下移一行。 Enter 光標下移一行。 nG 光標移至第 n 行首。 n+ 光標下移 n 行。 n- 光標上移 n 行。 n$ 光標移至第 n 行尾。 0 光標移至當前行首。 $ 光標移至當前行尾。 ·屏幕 H 光標移至屏幕頂行。 M 光標移至屏幕中間行。 L 光標移至屏幕最后行。 Ctrl+u 向文件首翻半屏。 Ctrl+d 向文件尾翻半屏。 Ctrl+f 向文件尾翻一屏。 Ctrl+b 向文件首翻一屏。 nz 將第 n 行滾至屏幕頂部。不指定 n 時將當前行滾至屏幕頂。 4}插入 # 在文件中插入行號(不是顯示行號,是插入!) ★:g/^/exec "s/^/".strpart(line(".")." ", 0, 4) ·光標 i 在光標前插入。 a 在光標后插入。 ·行 I 在當前行首插入。 A 在當前行尾插入。 o 在當前行之下一新行插入。 O 在當前行之上新開一行插入。 5)替換 r 替換當前字符。 R 替換當前字符及其后的字符,直至按 ESC 鍵。 s 從當前光標位置處開始,以輸入的文本代替指定數(shù)目的字符。 S 刪除指定數(shù)目的行,并以所輸入的文本代替。 6)修改 ncw 或 nCW 修改指定數(shù)目的字符。 nCC 修改指定數(shù)目的行。 :r filename 將文件 filename 插入在當前行之下 7)查找替換 / 把狹義單詞 寫到 搜索命令行 / 把廣義單詞 寫到 搜索命令行 :g/str/s/str1/str2/g 第一個g表示對每一個包括s1的行都進行替換, 第二個g表示對每一行的所有進行替換 包括str的行所有的str1都用str2替換 :%s/f $/for$/g 將每一行尾部的“f ”(f鍵和空格鍵)替換為for :%s/^/mv /g 在每一行的頭部添加“mv ”(mv鍵和空格鍵) :s/fred/a/g 替換fred成register a中的內(nèi)容,呵呵 :g/顯示含或的行 # 替換一個visual區(qū)域 # 選擇一個區(qū)域,然后輸入 :s/Emacs/Vim/ 等等,vim會自動進入:模式 :'s/Emacs/Vim/g 前面的'是vim自動添加的 # 在多個文檔中搜索 :bufdo /searchstr :argdo /searchstr 復制與剪切 xp 交換前后兩個字符的位置 ddp 上下兩行的位置交換 :g/fred/t$ 拷貝行,從fred到文件末尾(EOF) 9)窗口操作 :vne [filename] :sp [filename] :S [filename] :new [filename] :^w + ^r 交換兩個窗口的位置 ^w = 窗口等寬 :res -n 窗口高度減小n :res +n 窗口高度增大n :vert res -n :vert res +n 10)DOS格式文本轉(zhuǎn)成Unix格式文本 :1,$s/^M//g 11)書簽 在閱讀和編寫大的程序文件時,利用標記(書簽)功能定位是十分有幫助的。 將光標移到想做標記的位置。假如做一個名為“debug1”的標記,那么用戶可在命令模式下輸入做標記的命令“mdebug1”,然后敲入回車鍵,一個名為“debug1”的標記就做好了。 接下來用戶可以隨意將光標移到其它的位置,當在命令模式下輸入“`debug1”后,就能快速回到“debug1”的標記所在行的行首。 馨竹 2007-12-24 19:13 12)刪除操作 :%s/r//g 刪除DOS方式的回車^M :%s= *$== 刪除行尾空白 :%s/^(.*)n1/1$/ 刪除重復行 :%s/^.pdf/new.pdf/ 只是刪除第一個pdf :%s/// 又是刪除多行注釋(咦?為什么要說「又」呢?) :g/^s*$/d 刪除所有空行 :g!/^dd/d 刪除不含字符串'dd'的行 :v/^dd/d 同上 (譯釋:v == g!,就是不匹配!) :g/str1/,/str2/d 刪除所有第一個含str1到第一個含str2之間的行 :v/./.,/./-1join 壓縮空行 :g/^$/,/./-j 壓縮空行 :s/p1/p2/g:將當前行中所有p1均用p2替代 :n1,n2s/p1/p2/g:將第n1至n2行中所有p1均用p2替代 :g/p1/s//p2/g:將文件中所有p1均用p2替換 ndw 或 ndW 刪除光標處開始及其后的 n-1 個字符。 d0 刪至行首。 d$ 刪至行尾。 ndd 刪除當前行及其后 n-1 行。 x 或 X 刪除一個字符。 Ctrl+u 刪除輸入方式下所輸入的文本。 ^R 恢復u的操作 J 把下一行合并到當前行尾 V 選擇一行 ^V 按下^V后即可進行矩形的選擇了 aw 選擇單詞 iw 內(nèi)部單詞(無空格) as 選擇句子 is 選擇句子(無空格) ap 選擇段落 ip 選擇段落(無空格) D 刪除到行尾 x,y 刪除與復制包含高亮區(qū) dl 刪除當前字符(與x命令功能相同) d0 刪除到某一行的開始位置 d^ 刪除到某一行的第一個字符位置(不包括空格或TAB字符) dw 刪除到某個單詞的結(jié)尾位置 d3w 刪除到第三個單詞的結(jié)尾位置 db 刪除到某個單詞的開始位置 dW 刪除到某個以空格作為分隔符的單詞的結(jié)尾位置 dB 刪除到某個以空格作為分隔符的單詞的開始位置 d7B 刪除到前面7個以空格作為分隔符的單詞的開始位置 d) 刪除到某個語句的結(jié)尾位置 d4) 刪除到第四個語句的結(jié)尾位置 d( 刪除到某個語句的開始位置 d) 刪除到某個段落的結(jié)尾位置 d{ 刪除到某個段落的開始位置 d7{ 刪除到當前段落起始位置之前的第7個段落位置 dd 刪除當前行 d/text 刪除從文本中出現(xiàn)“text”中所指定字樣的位置, 一直向前直到下一個該字樣所出現(xiàn)的位置(但不包括該字樣)之間的內(nèi)容 dfc 刪除從文本中出現(xiàn)字符“c”的位置,一直向前直到下一個該字符所出現(xiàn)的位置(包括該字符)之間的內(nèi)容 dtc 刪除當前行直到下一個字符“c”所出現(xiàn)位置之間的內(nèi)容 D 刪除到某一行的結(jié)尾 d$ 刪除到某一行的結(jié)尾 5dd 刪除從當前行所開始的5行內(nèi)容 dL 刪除直到屏幕上最后一行的內(nèi)容 dH 刪除直到屏幕上第一行的內(nèi)容 dG 刪除直到工作緩存區(qū)結(jié)尾的內(nèi)容 d1G 刪除直到工作緩存區(qū)開始的內(nèi)容 修改命令操作 r 更改當前字符 cw 修改到某個單詞的結(jié)尾位置 c3w 修改到第三個單詞的結(jié)尾位置 cb 修改到某個單詞的開始位置 cW 修改到某個以空格作為分隔符的單詞的結(jié)尾位置 cB 修改到某個以空格作為分隔符的單詞的開始位置 c7B 修改到前面7個以空格作為分隔符的單詞的開始位置 c0 修改到某行的結(jié)尾位置 c} 修改到某個語句的結(jié)尾位置 c4} 修改到第四個語句的結(jié)尾位置 c( 修改到某個語句的開始位置 c) 修改到某個段落的結(jié)尾位置 c{ 修改到某個段落的開始位置 c7{ 修改到當前段落起始位置之前的第7個段落位置 ctc 修改當前行直到下一個字符c所出現(xiàn)位置之間的內(nèi)容 C 修改到某一行的結(jié)尾 cc 修改當前行 5cc 修改從當前行所開始的5行內(nèi)容 . 重復上一次修改! 13}Set 選項設(shè)置 set all 列出所有選項設(shè)置情況。 set term 設(shè)置終端類型。 set ignorecase 在搜索中忽略大小寫。 set list 顯示制表位(^I)和行尾標志($)。 set number 顯示行號。 set showmode 示用戶處在什么模式下 set report 顯示由面向行的命令修改國的行數(shù)目。 set terse 顯示簡短的警告信息。 set warn 在轉(zhuǎn)到別的文件時,若沒有保存當前文件則顯示 No write 信息。 set autowrite 在“:n”和“:!”命令之前都自動保存文件 set nomagic 允許在搜索模式中,使用前面不帶\的特殊字符。 set nowrapscan 禁止 vi 在搜索到達文件兩端時,又從另一端開始。 set mesg 允許 vi 顯示其他用戶用 write 寫到自己終端上的信息。 autoindent (ai) noai 使新行自動縮進,和上(下)行的位置對齊 autoprint (ap) ap 每條命令之后都顯示出修改之處 autowrite (aw) noaw 在:n,:!命令之前都自動保存文件 beautify (bf) nobf 在輸入的時候忽略所有的控制字符(除了制表鍵(tab),換行(newline),進紙(formfeed)) directory= (dir=) /tmp 存放緩沖區(qū)的目錄名 edcompatible noedcompatible 在替換的時候使用類ed的用法 errorbells (eb) errorbells 出錯的時候響鈴 exrc (ex) noexrc 允許在主目錄(home)外面之外放.exrc文件 hardtabs= (ht=) 8 設(shè)置硬制表的邊界 ignore case (ic) noic 正規(guī)式里忽略大小寫 lisp nolisp 打開lisp模式 list nolist 顯示所有的制表鍵和行的結(jié)尾 magic agic 可以使用更多的正規(guī)表達式 mesg mesg 允許向終端發(fā)送消息 number (nu) nonumber 顯示行號 open open 允許開放和可視化 optimize (opt) optimize 優(yōu)化吞吐量,打印時不發(fā)回車 paragraphs= (para=) IPLPPPQPPLIbp 設(shè)置{ & }的分界符 prompt prompt 命令模式下的輸入給出:的提示符 readonly (ro) noro 除非用!號否則不準保存文件 redraw noredraw 當編輯的時候重繪屏幕 remap remap 允許宏指向其他的宏 report= 5 如果影響的行數(shù)>這個數(shù)的話就報告 scroll 1/2 window 下卷屏幕時滾動屏幕的數(shù)目, 同樣這也是z命令輸出的行數(shù)(z 輸出2倍滾屏的大小) sections= SHNHH HU 定義節(jié)的末尾(當使用命令[[ 和 ]] 時) shell= (sh=) /bin/sh 缺省的SHELL,如果設(shè)置了環(huán)境變量SHELL的話,就使用變量 shiftwidth= (sw=) 8 當使用移動(shift)命令時移動的字符數(shù) showmatch (sm) nosm 顯示{, }, (, ), [, 或者 ] 的匹配情況 showmode noshowmode 顯示你處在什么模式下面 slowopen (slow) 插入之后不要立刻更新顯示 tabstop= (ts=) 8 設(shè)置制表停止位(tabstop)的長度 taglength= (tl=) 0 重要標記的字符個數(shù)(0表示所有的字符) tags= tag, /usr/lib/tags 定義包含標記的文件路徑 term= 設(shè)置終端類型 terse noterse 顯示簡短的錯誤信息 timeout (to) timeout 一秒鐘后鍵盤映射超時 ttytype= 設(shè)置終端類型 warn warn 顯示"No write since last change"信息 window= (w=) 可視模式下窗口的行數(shù) wrapmargin= (wm=) 0 右邊距,大于0的話最右邊的單詞將折行,留出n個空白位置 wrapscan (ws) ws 查找到文件尾后再重頭開始 writeany (wa) nowa 可以保存到任意一個文件去 14}特殊字符 ^ 匹配字符串位于行首。 $ 匹配字符串位于行尾。 . 用在模式串中,表示任何單個字符。 在命令模式下,重復上次的命令。 * 在模式串中,表示其前字符可出現(xiàn)任意多次。 [] 用在模式串中,表示指定方位內(nèi)字符,其中可用-表示一個字 符范圍,用^表示不在某個范圍內(nèi)的字符。 ESC 從插入狀態(tài)轉(zhuǎn)換到命令狀態(tài) ^[ 功能同 ESC 15]大小寫轉(zhuǎn)換 guu 行小寫 gUU 行大寫 g~~ 行翻轉(zhuǎn)(當然指大小寫啦) guw 字小寫(狹義字) 譯注:建議對比iw gUw 字大寫(狹義字) g~w 字翻轉(zhuǎn)(狹義字) vEU 字大寫(廣義字) vE~ 字翻轉(zhuǎn)(廣義字) ggguG 把整個文章全部小寫(ft!bt!) 16) 跳轉(zhuǎn)足跡'. 跳到最后修改的那一行 (超級有用)(ft,怎么又是這個評價) `. 不僅跳到最后修改的那一行,還要定位到修改點 依次沿著你的跳轉(zhuǎn)記錄向回跳 (從最近的一次開始) 依次沿著你的跳轉(zhuǎn)記錄向前跳 :ju(mps) 列出你跳轉(zhuǎn)的足跡 17)命令歷史 :history 列出歷史命令記錄 :his c 命令行命令歷史 :his s 搜索命令歷史 q/ 搜索命令歷史的窗口 q 命令行命令歷史的窗口 : 歷史命令記錄的窗口 18]寄存器 # 列出寄存器(Registers) :reg 顯示所有當前的registers "1p 表示引用register,1表示一個名字叫做1的register,p就是粘貼(paste)命令 譯釋: "也用來定義register 先輸入 ",表示定義register 然后輸入名字,如0~9,a~z 然后執(zhí)行刪除或復制命令,如dd或y, 或者是visual模式下的d(刪除選中的部分)或y(復制選中的部分) 則被刪除或復制的部分就被存入了這個命名的register 觀察:一個特殊的register, "" ,里面存儲了一個匿名的刪除/復制 在你執(zhí)行dd或y的時候,被作用的部分被存到了""中 19}命令行 "ayy@a 把當前行作為一個Vim命令來執(zhí)行 譯釋:"ayy 是定義當前行到register a,然后@a是執(zhí)行register a中存儲的指令 10yy copy 當前行以下10行 11} 排序 :%!sort -u 使用sort程序排序整個文件(用結(jié)果重寫文件) !1) sort -u 排序當前段落 (只能在normal模式下使用!!) :.,+5!sort 排序當前行及以下5行 20) 列操作 :%s= [^ ]+$=&&= 復制最后一列 :%s= f+$=&&= 一樣的功能 :%s= S+$=&& ft,還是一樣 :s/(.*).*)/2"1/ 顛倒用:分割的兩個字段 :%s(w+s+))str1:1str2: 處理列,替換所有在第三列中的str1 :%sw+)(.*s+)(w+)$:321: 交換第一列和最后一列 (共4列) ·.vimrc " Use Vim settings, rather then Vi settings (much better!). set nocompatible "c風格的縮進 :set expandtab "不使用tab只使用空格 :set cindent shiftwidth=4 "自動縮進 :set ai "語法 ":set filetype=java :set syntax=java "鍵入)、] 、},顯示(、[、{ :set showmatch "手工定義折疊 :set foldmethod=manual "標簽文件位置 set tags=/usr/share/vim/vim63/funcs.tags "在插入模式下通過按[Ctrl]N自動地將任何類、方法或者字段名補齊 set complete+=k " 不要用聲音煩我! set visualbell "歷史 :set history=50 "顯示行列位置 :set ruler "設(shè)置字符編碼 set fileencodings=gb2312 "set encoding=euc-cn "設(shè)置ruler set ruler "顯示當前命令 set showcmd "incsearch set incsearch " allow backspacing over everything in insert mode set backspace=indent,eol,start "自動檢測文件類型 :filetype on
            posted @ 2011-06-16 07:58 chaosuper 閱讀(240) | 評論 (0)編輯 收藏

            CSDN博客地址 http://blog.csdn.net/v_JULY_v/archive/2011/06/14/6543438.aspx http://blog.csdn.net/v_JULY_v
            posted @ 2011-06-15 22:19 chaosuper 閱讀(167) | 評論 (0)編輯 收藏

            內(nèi)核導航 http://oss.org.cn/kernel-book/ch01/1.5.3.htm 源代碼導航器 http://lxr.linux.no/linux+v2.6.39/net/ipv4/
            posted @ 2011-06-12 22:33 chaosuper 閱讀(137) | 評論 (0)編輯 收藏

            http://book.51cto.com/art/201104/253696.htm
            posted @ 2011-06-11 17:21 chaosuper 閱讀(177) | 評論 (0)編輯 收藏

            作為Linux下的程序開發(fā)人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟件慣例的Makefile就不那么容易了。   在本文中,將給大家介紹如何使用autoconf和automake兩個工具來幫助我們自動地生成符合自由軟件慣例的Makefile,這樣就可以象常見的GNU程序一樣,只要使用“./configure”,“make”,“make instal”就可以把程序安裝到Linux系統(tǒng)中去了。這將特別適合想做開放源代碼軟件的程序開發(fā)人員,又或如果你只是自己寫些小的Toy程序,那么這個文章對你也會有很大的幫助。   一、Makefile介紹   Makefile是用于自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀錄有文件的信息,在make時會決定在鏈接的時候需要重新編譯哪些文件。   Makefile的宗旨就是:讓編譯器知道要編譯一個文件需要依賴其他的哪些文件。當那些依賴文件有了改變,編譯器會自動的發(fā)現(xiàn)最終的生成文件已經(jīng)過時,而重新編譯相應(yīng)的模塊。   Makefile的基本結(jié)構(gòu)不是很復雜,但當一個程序開發(fā)人員開始寫Makefile時,經(jīng)常會懷疑自己寫的是否符合慣例,而且自己寫的Makefile經(jīng)常和自己的開發(fā)環(huán)境相關(guān)聯(lián),當系統(tǒng)環(huán)境變量或路徑發(fā)生了變化后,Makefile可能還要跟著修改。這樣就造成了手工書寫Makefile的諸多問題,automake恰好能很好地幫助我們解決這些問題。   使用automake,程序開發(fā)人員只需要寫一些簡單的含有預(yù)定義宏的文件,由autoconf根據(jù)一個宏文件生成configure,由automake根據(jù)另一個宏文件生成Makefile.in,再使用configure依據(jù)Makefile.in來生成一個符合慣例的Makefile。下面我們將詳細介紹Makefile的automake生成方法。   二、使用的環(huán)境  本文所提到的程序是基于Linux發(fā)行版本:Fedora Core release 1,它包含了我們要用到的autoconf,automake。   三、從helloworld入手   我們從大家最常使用的例子程序helloworld開始。   下面的過程如果簡單地說來就是:   新建三個文件:    helloworld.c    configure.in    Makefile.am   然后執(zhí)行: aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld   就可以看到Makefile被產(chǎn)生出來,而且可以將helloworld.c編譯通過。   很簡單吧,幾條命令就可以做出一個符合慣例的Makefile,感覺如何呀。   現(xiàn)在開始介紹詳細的過程:   1、建目錄   在你的工作目錄下建一個helloworld目錄,我們用它來存放helloworld程序及相關(guān)文件,如在/home/my/build下: $ mkdir helloword $ cd helloworld   2、 helloworld.c   然后用你自己最喜歡的編輯器寫一個hellowrold.c文件,如命令:vi helloworld.c。使用下面的代碼作為helloworld.c的內(nèi)容。 int main(int argc, char** argv) { printf("Hello, Linux World!\n"); return 0; }   完成后保存退出。   現(xiàn)在在helloworld目錄下就應(yīng)該有一個你自己寫的helloworld.c了。   3、生成configure   我們使用autoscan命令來幫助我們根據(jù)目錄下的源代碼生成一個configure.in的模板文件。   命令: $ autoscan $ ls configure.scan helloworld.c   執(zhí)行后在hellowrold目錄下會生成一個文件:configure.scan,我們可以拿它作為configure.in的藍本。   現(xiàn)在將configure.scan改名為configure.in,并且編輯它,按下面的內(nèi)容修改,去掉無關(guān)的語句: ============================configure.in內(nèi)容開始========================================= # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_INIT(helloworld.c) AM_INIT_AUTOMAKE(helloworld, 1.0) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile) ============================configure.in內(nèi)容結(jié)束=========================================   然后執(zhí)行命令aclocal和autoconf,分別會產(chǎn)生aclocal.m4及configure兩個文件: $ aclocal $ls aclocal.m4 configure.in helloworld.c $ autoconf $ ls aclocal.m4 autom4te.cache configure configure.in helloworld.c   大家可以看到configure.in內(nèi)容是一些宏定義,這些宏經(jīng)autoconf處理后會變成檢查系統(tǒng)特性、環(huán)境變量、軟件必須的參數(shù)的shell腳本。   autoconf 是用來生成自動配置軟件源代碼腳本(configure)的工具。configure腳本能獨立于autoconf運行,且在運行的過程中,不需要用戶的干預(yù)。   要生成configure文件,你必須告訴autoconf如何找到你所用的宏。方式是使用aclocal程序來生成你的aclocal.m4。   aclocal根據(jù)configure.in文件的內(nèi)容,自動生成aclocal.m4文件。aclocal是一個perl 腳本程序,它的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”。   autoconf從configure.in這個列舉編譯軟件時所需要各種參數(shù)的模板文件中創(chuàng)建configure。   autoconf需要GNU m4宏處理器來處理aclocal.m4,生成configure腳本。   m4是一個宏處理器。將輸入拷貝到輸出,同時將宏展開。宏可以是內(nèi)嵌的,也可以是用戶定義的。除了可以展開宏,m4還有一些內(nèi)建的函數(shù),用來引用文件,執(zhí)行命令,整數(shù)運算,文本操作,循環(huán)等。m4既可以作為編譯器的前端,也可以單獨作為一個宏處理器。 4、新建Makefile.am   新建Makefile.am文件,命令: $ vi Makefile.am   內(nèi)容如下: AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=helloworld helloworld_SOURCES=helloworld.c   automake會根據(jù)你寫的Makefile.am來自動生成Makefile.in。   Makefile.am中定義的宏和目標,會指導automake生成指定的代碼。例如,宏bin_PROGRAMS將導致編譯和連接的目標被生成。   5、運行automake   命令: $ automake --add-missing configure.in: installing `./install-sh' configure.in: installing `./mkinstalldirs' configure.in: installing `./missing' Makefile.am: installing `./depcomp'   automake會根據(jù)Makefile.am文件產(chǎn)生一些文件,包含最重要的Makefile.in。   6、執(zhí)行configure生成Makefile $ ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc checking for C compiler default output... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ANSI C... none needed checking for style of include used by make... GNU checking dependency style of gcc... gcc3 configure: creating ./config.status config.status: creating Makefile config.status: executing depfiles commands $ ls -l Makefile -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile   你可以看到,此時Makefile已經(jīng)產(chǎn)生出來了。   7、使用Makefile編譯代碼 $ make if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" - DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0" -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \ -c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \ then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \ else rm -f ".deps/helloworld.Tpo"; exit 1; \ fi gcc -g -O2 -o helloworld helloworld.o   運行helloworld $ ./helloworld Hello, Linux World!   這樣helloworld就編譯出來了,你如果按上面的步驟來做的話,應(yīng)該也會很容易地編譯出正確的helloworld文件。你還可以試著使用一些其他的make命令,如make clean,make install,make dist,看看它們會給你什么樣的效果。感覺如何?自己也能寫出這么專業(yè)的Makefile,老板一定會對你刮目相看。 四、深入淺出   針對上面提到的各個命令,我們再做些詳細的介紹。   1、 autoscan   autoscan是用來掃描源代碼目錄生成configure.scan文件的。autoscan可以用目錄名做為參數(shù),但如果你不使用參數(shù)的話,那么autoscan將認為使用的是當前目錄。autoscan將掃描你所指定目錄中的源文件,并創(chuàng)建configure.scan文件。   2、 configure.scan   configure.scan包含了系統(tǒng)配置的基本選項,里面都是一些宏定義。我們需要將它改名為configure.in   3、 aclocal   aclocal是一個perl 腳本程序。aclocal根據(jù)configure.in文件的內(nèi)容,自動生成aclocal.m4文件。aclocal的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”。   4、 autoconf   autoconf是用來產(chǎn)生configure文件的。configure是一個腳本,它能設(shè)置源程序來適應(yīng)各種不同的操作系統(tǒng)平臺,并且根據(jù)不同的系統(tǒng)來產(chǎn)生合適的Makefile,從而可以使你的源代碼能在不同的操作系統(tǒng)平臺上被編譯出來。   configure.in文件的內(nèi)容是一些宏,這些宏經(jīng)過autoconf 處理后會變成檢查系統(tǒng)特性、環(huán)境變量、軟件必須的參數(shù)的shell腳本。configure.in文件中的宏的順序并沒有規(guī)定,但是你必須在所有宏的最前面和最后面分別加上AC_INIT宏和AC_OUTPUT宏。   在configure.ini中:   #號表示注釋,這個宏后面的內(nèi)容將被忽略。   AC_INIT(FILE)   這個宏用來檢查源代碼所在的路徑。 AM_INIT_AUTOMAKE(PACKAGE, VERSION)    這個宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號:PACKAGE是軟件包的名字,VERSION是版本號。當你使用make dist命令時,它會給你生成一個類似helloworld-1.0.tar.gz的軟件發(fā)行包,其中就有對應(yīng)的軟件包的名字和版本號。 AC_PROG_CC   這個宏將檢查系統(tǒng)所用的C編譯器。 AC_OUTPUT(FILE)   這個宏是我們要輸出的Makefile的名字。   我們在使用automake時,實際上還需要用到其他的一些宏,但我們可以用aclocal 來幫我們自動產(chǎn)生。執(zhí)行aclocal后我們會得到aclocal.m4文件。   產(chǎn)生了configure.in和aclocal.m4 兩個宏文件后,我們就可以使用autoconf來產(chǎn)生configure文件了。   5、 Makefile.am   Makefile.am是用來生成Makefile.in的,需要你手工書寫。Makefile.am中定義了一些內(nèi)容: AUTOMAKE_OPTIONS   這個是automake的選項。在執(zhí)行automake時,它會檢查目錄下是否存在標準GNU軟件包中應(yīng)具備的各種文件,例如AUTHORS、ChangeLog、NEWS等文件。我們將其設(shè)置成foreign時,automake會改用一般軟件包的標準來檢查。 bin_PROGRAMS   這個是指定我們所要產(chǎn)生的可執(zhí)行文件的文件名。如果你要產(chǎn)生多個可執(zhí)行文件,那么在各個名字間用空格隔開。 helloworld_SOURCES   這個是指定產(chǎn)生“helloworld”時所需要的源代碼。如果它用到了多個源文件,那么請使用空格符號將它們隔開。比如需要helloworld.h,helloworld.c那么請寫成helloworld_SOURCES= helloworld.h helloworld.c。   如果你在bin_PROGRAMS定義了多個可執(zhí)行文件,則對應(yīng)每個可執(zhí)行文件都要定義相對的filename_SOURCES。   6、 automake   我們使用automake --add-missing來產(chǎn)生Makefile.in。   選項--add-missing的定義是“add missing standard files to package”,它會讓automake加入一個標準的軟件包所必須的一些文件。   我們用automake產(chǎn)生出來的Makefile.in文件是符合GNU Makefile慣例的,接下來我們只要執(zhí)行configure這個shell 腳本就可以產(chǎn)生合適的 Makefile 文件了。   7、 Makefile   在符合GNU Makefiel慣例的Makefile中,包含了一些基本的預(yù)先定義的操作: make   根據(jù)Makefile編譯源代碼,連接,生成目標文件,可執(zhí)行文件。 make clean   清除上次的make命令所產(chǎn)生的object文件(后綴為“.o”的文件)及可執(zhí)行文件。 make install   將編譯成功的可執(zhí)行文件安裝到系統(tǒng)目錄中,一般為/usr/local/bin目錄。 make dist   產(chǎn)生發(fā)布軟件包文件(即distribution package)。這個命令將會將可執(zhí)行文件及相關(guān)文件打包成一個tar.gz壓縮的文件用來作為發(fā)布軟件的軟件包。   它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。 make distcheck   生成發(fā)布軟件包并對其進行測試檢查,以確定發(fā)布包的正確性。這個操作將自動把壓縮包文件解開,然后執(zhí)行configure命令,并且執(zhí)行make,來確認編譯不出現(xiàn)錯誤,最后提示你軟件包已經(jīng)準備好,可以發(fā)布了。 =============================================== helloworld-1.0.tar.gz is ready for distribution =============================================== make distclean   類似make clean,但同時也將configure生成的文件全部刪除掉,包括Makefile。   五、結(jié)束語   通過上面的介紹,你應(yīng)該可以很容易地生成一個你自己的符合GNU慣例的Makefile文件及對應(yīng)的項目文件。   如果你想寫出更復雜的且符合慣例的Makefile,你可以參考一些開放代碼的項目中的configure.in和Makefile.am文件,比如:嵌入式數(shù)據(jù)庫sqlite,單元測試cppunit。
            posted @ 2011-05-09 11:19 chaosuper 閱讀(379) | 評論 (0)編輯 收藏

            http://blog.csdn.net/hecant/archive/2007/12/19/1954144.aspx
            posted @ 2011-05-08 11:17 chaosuper 閱讀(531) | 評論 (0)編輯 收藏

            要獲得另一窗體視圖類中的某控件指針,首先獲得視圖指針是難點,獲的視圖指針再用GetDlgItem函數(shù)就容易可以獲得控件指針 獲得各種視圖指針如下 1) 在View中獲得Doc指針 2) 在App中獲得MainFrame指針 3) 在View中獲得MainFrame指針 4) 獲得View(已建立)指針 5) 獲得當前文檔指針 6) 獲得狀態(tài)欄與工具欄指針 7) 獲得狀態(tài)欄與工具欄變量 8) 在Mainframe獲得菜單指針 9) 在任何類中獲得應(yīng)用程序類 10) 從文檔類取得視圖類的指針(1) 11) 在App中獲得文檔模板指針 12) 從文檔模板獲得文檔類指針 13) 在文檔類中獲得文檔模板指針 14) 從文檔類取得視圖類的指針(2) 15) 從一個視圖類取得另一視圖類的指針 16)獲取分割視圖中各個視圖的指針 VC中編程對于剛剛開始學習的同學,最大的障礙和問題就是消息機制和指針獲取與操作。其實這些內(nèi)容基本上是每本VC學習工具書上必講的內(nèi)容,而且通過MSDN很多問題都能解決。 下面文字主要是個人在編程中指針使用的一些體會,說的不當?shù)牡胤秸堉刚? 一般我們使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,無論是多文檔還是單文檔,都存在指針獲取和操作問題。 下面這節(jié)內(nèi)容主要是一般的框架,然后再講多線程中的指針使用。使用到的類需要包含響應(yīng)的頭文件。首先一般獲得本類(視,文檔,對話框都支持)實例指針this,用this的目的,主要可以通過類中的函數(shù)向其他類或者函數(shù)中發(fā)指針,以便于在非本類中操作和使用本類中的功能。 1) 在View中獲得Doc指針 CYouSDIDoc *pDoc=GetDocument();一個視只能有一個文檔。 2) 在App中獲得MainFrame指針 CWinApp 中的 m_pMainWnd變量就是MainFrame的指針 也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd(); 3) 在View中獲得MainFrame指針 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd; 4) 獲得View(已建立)指針 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd; CyouView *pView=(CyouView *)pMain->GetActiveView(); 5) 獲得當前文檔指針 CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument(); 6) 獲得狀態(tài)欄與工具欄指針 CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR); 7) 如果框架中加入工具欄和狀態(tài)欄變量還可以這樣 (CMainFrame *)GetParent()->m_wndToolBar; (CMainFrame *)GetParent()->m_wndStatusBar; 8) 在Mainframe獲得菜單指針 CMenu *pMenu=m_pMainWnd->GetMenu(); 9) 在任何類中獲得應(yīng)用程序類 用MFC全局函數(shù)AfxGetApp()獲得。 10) 從文檔類取得視圖類的指針 我是從http://download.cqcnc.com/soft/program/article/vc/vc405.html學到的,從文檔獲得視圖類指針目的一般為了控制同一文檔的多個視圖的定位問題,我的體會特別是文字處理CEditView當產(chǎn)生多個視圖類時,這個功能是非常需要的。 CDocument類提供了兩個函數(shù)用于視圖類的定位: GetFirstViewPosition()和GetNextView() virtual POSITION GetFirstViewPosition() const; virtual CView* GetNextView(POSITION& rPosition) const; 注意:GetNextView()括號中的參數(shù)用的是引用方式,因此執(zhí)行后值可能改變。 GetFirstViewPosition()用于返回第一個視圖位置(返回的并非視圖類指針,而是一個POSITION類型值),GetNextView()有兩個功能:返回下一個視圖類的指針以及用引用調(diào)用的方式來改變傳入的POSITION類型參數(shù)的值。很明顯,在Test程序中,只有一個視圖類,因此只需將這兩個函數(shù)調(diào)用一次即可得到CTestView的指針如下(需定義一個POSITION結(jié)構(gòu)變量來輔助操作): CTestView* pTestView; POSITION pos=GetFirstViewPosition(); pTestView=GetNextView(pos); 這樣,便可到了CTestView類的指針pTestView.執(zhí)行完幾句后,變量pos=NULL,因為沒有下一個視圖類,自然也沒有下一個視圖類的POSITION.但是這幾條語句太簡單,不具有太強的通用性和安全特征;當象前面說的那樣,當要在多個視圖為中返回某個指定類的指針時,我們需要遍歷所有視圖類,直到找到指定類為止。判斷一個類指針指向的是否某個類的實例時,可用IsKindOf()成員函數(shù)時行檢查,如: pView->IsKindOf(RUNTIME_CLASS(CTestView)); 即可檢查pView所指是否是CTestView類。 有了以上基礎(chǔ),我們已經(jīng)可以從文檔類取得任何類的指針。為了方便,我們將其作為一個文檔類的成員函數(shù),它有一個參數(shù),表示要獲得哪個類的指針。實現(xiàn)如下: CView* CTestDoc::GetView(CRuntimeClass* pClass) { CView* pView; POSITION pos=GetFirstViewPosition(); while(pos!=NULL){ pView=GetNextView(pos); if(!pView->IsKindOf(pClass)) break; } if(!pView->IsKindOf(pClass)){ AfxMessageBox("Connt Locate the View.\r\n http://www.VCKBASE.com"); return NULL; } return pView; } 其中用了兩次視圖類的成員函數(shù)IsKindOf()來判斷,是因為退出while循環(huán)有三種可能: 1.pos為NULL,即已經(jīng)不存在下一個視圖類供操作; 2.pView已符合要求。 1和2同是滿足。這是因為GetNextView()的功能是將當前視圖指針改變成一個視圖的位置同時返回當前視圖指針,因此pos是pView的下一個視圖類的POSITION,完全有可能既是pos==NULL又是pView符合需要。當所需的視圖是最后一個視圖是最后一個視圖類時就如引。因此需采用兩次判斷。 使用該函數(shù)應(yīng)遵循如下格式(以取得CTestView指針為例):CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView)); RUNTIME_CLASS是一個宏,可以簡單地理解它的作用:將類的名字轉(zhuǎn)化為CRuntimeClass為指針。 至于強制類型轉(zhuǎn)換也是為了安全特性考慮的,因為從同一個基類之間的指針類型是互相兼容的。這種強制類型轉(zhuǎn)換也許并不必要,但能避免一些可能出現(xiàn)的麻煩。 3.從一個視圖類取得另一視圖類的指針 綜合1和2,很容易得出視圖類之間互相獲得指針的方法:就是用文檔類作中轉(zhuǎn),先用1的方法得到文檔類的指針,再用2的方法,以文檔類的視圖定位函數(shù)取得另一個視圖類。同樣,可以實現(xiàn)成一個函數(shù): (假設(shè)要從CTestAView中取得指向其它視圖類的指針)CView* CTestAView::GetView(CRuntimeClass* pClass) { CTestDoc* pDoc=(CTestDoc*)GetDocument(); CView* pView; POSITION pos=pDoc->GetFirstViewPosition(); while(pos!=NULL){ pView=pDoc->GetNextView(pos); if(!pView->IsKindOf(pClass)) break; } if(!pView->IsKindOf(pClass)){ AfxMessageBox("Connt Locate the View."); return NULL; } return pView; } 這個函數(shù)和2中的GetView()相比,一是多了第一句以取得文檔類指針,二是在GetFirstViewPosition()和GetNextView()前加上了文檔類指針,以表示它們是文檔類成員函數(shù)。 有了此函數(shù);當要從CTestAView中取得CTestBView的指針時,只需如下:CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView)); 11)對于單文檔中也可以加入多個文檔模板,但是一般的開發(fā)就使用MDI方式開發(fā)多文檔模板,其方法與上述視圖的獲取方法很接近,這里稍做解釋,如果不清楚,請查閱MSDN,(以下四個內(nèi)容(11、12、13、14)來源:http://sanjianxia.myrice.com/vc/vc45.htm) 可以用CWinApp::GetFirstDocTemplatePostion獲得應(yīng)用程序注冊的第一個文檔模板的位置; 利用該值來調(diào)用CWinApp::GetNextDocTemplate函數(shù),獲得第一個CDocTemplate對象指針。 POSITION GetFirstDocTemplate( ) const; CDocTemplate *GetNextDocTemplate( POSITION & pos ) const; 第二個函數(shù)返回由pos 標識的文檔模板。POSITION是MFC定義的一個用于迭代或?qū)ο笾羔槞z索的值。通過這兩個函數(shù),應(yīng)用程序可以遍歷整個文檔模板列表。如果被檢索的文檔模板是模板列表中的最后一個,則pos參數(shù)被置為NULL。 接我的: 12)一個文檔模板可以有多個文檔,每個文檔模板都保留并維護了一個所有對應(yīng)文檔的指針列表。 用CDocTemplate::GetFirstDocPosition函數(shù)獲得與文檔模板相關(guān)的文檔集合中第一個文檔的位置,并用POSITION值作為CDocTemplate::GetNextDoc的參數(shù)來重復遍歷與模板相關(guān)的文檔列表。函數(shù)原形為: viaual POSITION GetFirstDocPosition( ) const = 0; visual CDocument *GetNextDoc(POSITION & rPos) const = 0; 如果列表為空,則rPos被置為NULL. 13)在文檔中可以調(diào)用CDocument::GetDocTemplate獲得指向該文檔模板的指針。函數(shù)原形如下: CDocTemplate * GetDocTemplate ( ) const; 如果該文檔不屬于文檔模板管理,則返回值為NULL。 14)一個文檔可以有多個視。每一個文檔都保留并維護一個所有相關(guān)視的列表。CDocument::AddView將一個視連接到文檔上,將該視加入到文檔相聯(lián)系的視的列表中,并將視的文檔指針指向該文檔。當有File/New、File/Open、Windows/New或Window/Split的命令而將一個新創(chuàng)建的視的對象連接到文檔上時, MFC會自動調(diào)用該函數(shù),框架通過文檔/視的結(jié)構(gòu)將文檔和視聯(lián)系起來。當然,程序員也可以根據(jù)自己的需要調(diào)用該函數(shù)。 Virtual POSITION GetFirstViewPosition( ) const; Virtual CView * GetNextView( POSITION &rPosition) cosnt; 應(yīng)用程序可以調(diào)用CDocument::GetFirstViewPosition返回與調(diào)用文檔相聯(lián)系的視的列表中的第一個視的位置,并調(diào)用CDocument::GetNextView返回指定位置的視,并將rPositon的值置為列表中下一個視的POSITION值。如果找到的視為列表中的最后一個視,則將rPosition置為NULL. 15)從一個視圖類取得另一視圖類的指針 這個應(yīng)用在多視的應(yīng)用程序中很多見,一般如果自己在主程序或者主框架中做好變量記號,也可以獲得,還有比較通用的就是用文檔類作中轉(zhuǎn),以文檔類的視圖遍歷定位,取得另一個視圖類。這個功能從本文第10項中可以得到。 16)獲取分割視圖中各個視圖的指針 CSplitterWnd m_wndSplitter; m_wndSplitter.CreateStatic(this, 1, 2);//分割成一行兩列 m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftPaneView), CSize(10, 10), pContext); m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightPaneFrame), CSize(0, 0), pContext); //獲取左邊視圖的兩種方法 CLeftPaneView* pLeftPaneView = (CLeftPaneView*) m_wndSplitter.GetPane(0,0); //上一句可以用下句代替: //CLeftPaneView* pLeftPaneView = (CLeftPaneView *)GetActiveView(); //獲取右邊視圖 pLeftPaneView->m_pRightPaneFrame = (CRightPaneFrame*) m_wndSplitter.GetPane(0,1);
            posted @ 2010-07-08 17:26 chaosuper 閱讀(562) | 評論 (0)編輯 收藏

            Factory:客戶類和工廠類分開。消費者任何時候需要某種產(chǎn)品,只需向工廠請求即可。消費者無須修改就可以接納新產(chǎn)品。缺點是當產(chǎn)品修改時,工廠類也要做相應(yīng)的修改。如:如何創(chuàng)建及如何向客戶端提供。 Builder:將產(chǎn)品的內(nèi)部表象和產(chǎn)品的生成過程分割開來,從而使一個建造過程生成具有不同的內(nèi)部表象的產(chǎn)品對象。建造模式使得產(chǎn)品內(nèi)部表象可以獨立的變化,客戶不必知道產(chǎn)品內(nèi)部組成的細節(jié)。建造模式可以強制實行一種分步驟進行的建造過程。    Factory Method:核心工廠類不再負責所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做,成為一個抽象工廠角色,僅負責給出具體工廠類必須實現(xiàn)的接口,而不接觸哪一個產(chǎn)品類應(yīng)當被實例化這種細節(jié)。 Prototype:通過給出一個原型對象來指明所要創(chuàng)建的對象的類型,然后用復制這個原型對象的方法創(chuàng)建出更多同類型的對象。原始模型模式允許動態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級結(jié)構(gòu),原始模型模式適用于任何的等級結(jié)構(gòu)。缺點是每一個類都必須配備一個克隆方法。    Singleton:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例單例模式。單例模式只應(yīng)在有真正的"單一實例"的需求時才可使用。 Adapter:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個合適的實例給客戶端。    Bridge:將抽象化與實現(xiàn)化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關(guān)聯(lián)變成弱關(guān)聯(lián),也就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以獨立的變化。    Composite:合成模式將對象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系。合成模式就是一個處理對象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。    Decorator:裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關(guān)系的一個替代方案,提供比繼承更多的靈活性。動態(tài)給一個對象增加功能,這些功能可以再動態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。   Facade:外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的門面對象進行。門面模式提供一個高層次的接口,使得子系統(tǒng)更易于使用。每一個子系統(tǒng)只有一個門面類,而且此門面類只有一個實例,也就是說它是一個單例模式。但整個系統(tǒng)可以有多個門面類。   Flyweight:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)和外蘊狀態(tài)。內(nèi)蘊狀態(tài)存儲在享元內(nèi)部,不會隨環(huán)境的改變而有所不同。外蘊狀態(tài)是隨環(huán)境的改變而改變的。外蘊狀態(tài)不能影響內(nèi)蘊狀態(tài),它們是相互獨立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,將不可以共享的狀態(tài)從類里剔除出去??蛻舳瞬豢梢灾苯觿?chuàng)建被共享的對象,而應(yīng)當使用一個工廠對象負責創(chuàng)建被共享的對象。享元模式大幅度的降低內(nèi)存中對象的數(shù)量。 Proxy:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機構(gòu)代表另一個人或者一個機構(gòu)采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用??蛻舳朔直娌怀龃碇黝}對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色代為創(chuàng)建并傳入。    Chain of Responsibility:在責任鏈模式中,很多對象由每一個對象對其下家的引用而接 起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求??蛻舨⒉恢梨溕系哪囊粋€對象最終處理這個請求,系統(tǒng)可以在不影響客戶端的情況下動態(tài)的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。一個請求可以最終不被任何接收端對象所接受。   Command:命令模式把一個請求或者操作封裝到一個對象中。命令模式把發(fā)出命令的責任和執(zhí)行命令的責任分割開,委派給不同的對象。命令模式允許請求的一方和發(fā)送的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否執(zhí)行,何時被執(zhí)行以及是怎么被執(zhí)行的。系統(tǒng)支持命令的撤消。   Interpreter:給定一個語言后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器??蛻舳丝梢允褂眠@個解釋器來解釋這個語言中的句子。解釋器模式將描述怎樣在有了一個簡單的文法后,使用模式設(shè)計解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個代表文法的命令類的等級結(jié)構(gòu),也就是一系列的組合規(guī)則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。命令對象的等級結(jié)構(gòu)中的對象的任何排列組合都是一個語言。    Iterator:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內(nèi)部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的迭代子對象,每一個迭代子的迭代狀態(tài)可以是彼此獨立的。迭代算法可以獨立于聚集角色變化。    Mediator:調(diào)停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發(fā)生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調(diào)停者模式將多對多的相互作用轉(zhuǎn)化為一對多的相互作用。調(diào)停者模式將對象的行為和協(xié)作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。    Memento:備忘錄對象是一個用來存儲另外一個對象內(nèi)部狀態(tài)的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態(tài)捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。    Observer:觀察者模式定義了一種一隊多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。    State:狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態(tài)模式把所研究的對象的行為包裝在不同的狀態(tài)對象里,每一個狀態(tài)對象都屬于一個抽象狀態(tài)類的一個子類。狀態(tài)模式的意圖是讓一個對象在其內(nèi)部狀態(tài)改變的時候,其行為也隨之改變。狀態(tài)模式需要對每一個系統(tǒng)可能取得的狀態(tài)創(chuàng)立一個狀態(tài)類的子類。當系統(tǒng)的狀態(tài)變化時,系統(tǒng)便改變所選的子類。    Strategy:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。策略模式把行為和環(huán)境分開。環(huán)境類負責維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環(huán)境獨立開來,算法的增減,修改都不會影響到環(huán)境和客戶端。 Template Method:模板方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn)。先制定一個頂級邏輯框架,而將邏輯的細節(jié)留給具體的子類去實現(xiàn)。    Visitor:訪問者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數(shù)據(jù)結(jié)構(gòu)可以保持不變。訪問者模式適用于數(shù)據(jù)結(jié)構(gòu)相對未定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加一個新的訪問者類。訪問者模式將有關(guān)的行為集中到一個訪問者對象中,而不是分散到一個個的節(jié)點類中。當使用訪問者模式時,要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結(jié)構(gòu)訪問屬于不同的等級結(jié)構(gòu)的成員類。
            posted @ 2010-04-10 09:37 chaosuper 閱讀(196) | 評論 (0)編輯 收藏

            關(guān)于北京戶口的知識 1.問:網(wǎng)上一些人說今年應(yīng)屆生北京戶口特別難辦,是真的嗎? 答:每年都有這么說的,主要是因為公司忘記了申請或者不懂得申請策略,打算招10人的應(yīng)該申請20個指標才保險。其實公司申請指標非常容易特別是注冊在海淀的企業(yè),除了營業(yè)執(zhí)照不需要任何證明,有人說要看稅款什么的都是沒有根據(jù)的,最近兩年連高新證都不看了。事實是由于公司虛報和轉(zhuǎn)賣戶口的人存在,每年都有大量戶口指標作廢,同時有大量同學沒有順利落戶。 2.問:費用到底是多少? 答:都說一百遍了,所有費用,包括人才的檔案保管費一共2k左右。 3.問:落了北京戶口我就是名正言順的北京人了? 答:法律上來說是的。但是拿到綠卡的中國人你認為他們是中國人還是美國人?老人家在北京呆了半輩子你認為他是湖南人還是北京人?說自己是哪里人時要對得起父母,戶籍可以變,出身永遠不會變。 4.問:可以給孩子落戶了? 答:集體戶口不可以,必須買房改為個人戶口才行。有人說可以落到親戚甚至朋友那里,假如可行的話北京所有的小孩估計都落到北大附小清華附小學區(qū)了。退一步講,假如你花10萬元收買了派出所允許落戶,讓孩子在北京做個吉普賽人你忍心嗎? 5.問:那買房不就行了嗎? 答:是的,在北京生存發(fā)展這是唯一的選擇。前提是支付15到25萬的首付和裝修入戶費,另一個條件是為了供養(yǎng)房子和以后可能出現(xiàn)的小孩,每年兩人稅后收入至少10萬元,而且這種收入至少要穩(wěn)定20年。當然如果你父母那里足夠殷實或者自己是某一方面的專才這些都不是問題,否則沒錢看病或者40歲了還欠著父母20萬都是有可能的。 6.問:買了房落了戶孩子就可以讀名校了 答:完全錯誤。名校學區(qū)早已限定,不會擴大,特別是80萬元以下的小區(qū)都在四環(huán)以外,上地三小,馬連洼小學什么的倒不成問題。想讀名校,拿錢,今年北大附小是6萬,有沒有北京戶口一個價。這是小學,北大附中20萬并且有認識人不見得能進去,北京有權(quán)有勢的人多的是。 7.問:算了,我不考慮那么多了,至少有集體戶口辦里一些手續(xù)方便些吧? 答:未必。目前買車已沒有限制,辦理出國手續(xù)通過公司-人才-派出所,辦理起來并不比放在老家方便。 8.問:北京信息豐富,就業(yè)機會多 答:目前的網(wǎng)絡(luò)無處不在,西部偏遠地區(qū)的農(nóng)民在網(wǎng)上得到的信息不會比北京it人士少。就業(yè)機會多?冷靜點吧,看看人才市場的行情,就業(yè)機會再多也沒有老板的選擇機會多,老板正準備把你趕走,用更少的錢雇傭更年輕的更努力更有活力并且沒有家庭負擔的新人呢。當然除非你的技能比較特別,比如中醫(yī)或者面點師。當然,如果你人際關(guān)系好、商務(wù)能力足夠強,在北京還是大有作為的。 9.問:先辦個北京戶口,哪天混不下去了轉(zhuǎn)到小城市不行嗎? 答:不行。大家只知道其他城市轉(zhuǎn)到北京非常難,實際上從北京轉(zhuǎn)到其他城市的難度完全一樣,這不是城市“好”“壞”的問題,這是我國戶籍制度和人事調(diào)動制度決定的(省部級領(lǐng)導不受此限制)。 10.問:難道北京戶口就沒有優(yōu)勢了嗎? 答:有,北京特困救助高于全國平均水平。 11.問:你說的這些顛覆了我對北京戶口的美好印象,是真的嗎? 答:兼聽則明,了解真正情況需要問一問你認識的人,別問那幾個最燦爛的,問問那些占人口大多數(shù)的,畢業(yè)3、4年的,默默無聞的。和你的職業(yè)發(fā)展相比戶口不值一提,北京工作居住證基本上有了戶口的所有功能,包括孩子入學。 12.問:哎,難道現(xiàn)在畢業(yè)這么凄慘嗎? 答:別那么悲觀,老人家說過:海闊天空,大有作為 13.問:我家里可以給我提供20萬的首付,我們兩人畢業(yè)就能拿到稅后10萬,我有能力 在北京發(fā)展,那北京戶口多少錢合適? 答:5000,北京戶口頂多值這個價了。 14..辦理北京戶口的流程是怎樣的? 單位和學生達成為就業(yè)意向。并且單位有戶口指標,承諾給解決北京戶口后,就開始進入 北京戶口的審批程序。(除了一些極老的國企,其他企業(yè),包括北大方正、聯(lián)想等接收應(yīng) 屆畢業(yè)生都是下面這些程序) 審批時間是:春季研究生從3月1日開始、其他畢業(yè)生從4月1日開始,截止時間為6月25日。 審批依據(jù):北京人事局規(guī)定本科生進京專業(yè)目錄,在此之外的本科專業(yè)辦理難度就比較大 ,除非單位極牛又全力給你辦理。研究生辦理戶口雖然沒有專業(yè)限制,但是人事局審批時 要求專業(yè)對口,否則不給審批。今年就有網(wǎng)絡(luò)公司接收化學專業(yè)碩士被拒的。 北京人事局規(guī)定本科生進京專業(yè)目錄,在此之外的本科專業(yè)辦理難度就比較大。具體專業(yè) 是: 北京市2005年引進非北京生源應(yīng)屆本科畢業(yè)生緊缺專業(yè)目錄 計算機 建筑 機械 電力系統(tǒng)及其自動化 通信工程 汽車 臨床醫(yī)學 路橋 護理學 人力資源管理 市場營銷 會計 審批流程: 學生將申報材料交給公司,公司去人事局申報,一般5-10個工作日會有審批結(jié)果,但有時 會拖延,例如去年3月份交上去的本科審批結(jié)果就到5月份才下來。 申報材料: 1)推薦表(要求學校就業(yè)分配部門蓋章,如果是多頁的,需要在各頁蓋章或加蓋齊縫章 ) 2)成績單(本科要求是學校教務(wù)部門蓋章,研究生可以是研究生院等校級單位蓋章,絕對不可以只有系或?qū)W院的章,如果你拿到的成績單只有系章, 不用去換,只要拿著它去教務(wù)單位補一個章就行了,如果是多頁情況,也需要逐頁蓋章) 3)統(tǒng)分證明(學校就業(yè)分配部門蓋章,只要寫上xx同學是統(tǒng)分畢業(yè)生就行這樣一句話就 行) 4)品行鑒定(自己寫或是打印,由系里面蓋章就行了) 5)如果是本科,需要提交四級或六級證書原件、復印件各一份 6)身份證復印件(只有這個是復印件,其他材料都要求原件) 7)三方協(xié)議(可以空著) 批準落戶的,會發(fā)給北京市人事局的接收函。不批準的,會把所有申報材料退還給公司,公司再退還給學生。批準落戶的,拿著人事局接受函(自己留一份復印件)和三方協(xié)議交給學校,讓學校在三方協(xié)議上蓋章,學校看到接收函,則可以在三方上蓋章,表示同意該生的就業(yè)選擇(因為如果北京市還沒同意要你,學校就給你派遣到北京,你的檔案和戶口就會飄在半空,無法落地,境況非常麻煩)。然后返一份給單位,自己留一份。辦完這些手續(xù),就等著畢業(yè),學校給你派遣證和戶口遷移卡,拿這些東西去公司報到。然后再和單位簽勞動合同什么的。畢業(yè)落戶階段三方協(xié)議是很重要的。它不同于勞動合同。,三方協(xié)議最主要的作用就是約束你的人事關(guān)系的轉(zhuǎn)移,三方協(xié)議上面的檔案轉(zhuǎn)寄地址,戶口轉(zhuǎn)移地址就是學校給你派遣檔案、 戶口的用的。所以,如果單位不能給你解決戶口,也就沒有資格和你簽署三方協(xié)議 。但單位可以和你簽勞動合同,勞動合同就和戶口、檔案沒有關(guān)系了,是約束勞動者和單 位的關(guān)系的。其實,解決你戶口的單位,在和你簽完三方協(xié)議后,也還要簽勞動合同的。因為三方協(xié)議就說明你的人事關(guān)系的轉(zhuǎn)移的,沒有涉及勞動關(guān)系。畢業(yè)后,學校給你派遣證和戶口遷移卡,你就開始報到落戶程序。 辦理程序及辦理地點 第一步:到海淀人才服務(wù)中心報到 1、在海淀人才網(wǎng)www.hdrc.com.cn 查畢業(yè)生檔案是否已到,如到請記錄編號 2、如檔案已到,帶接收單位填寫的保留全民身份調(diào)入表1份并加蓋單位公章和報到證(原件、復印件各一份); 3、如需在人才服務(wù)中心辦理集體戶口者,請帶在網(wǎng)上下載的“集體戶口申請表”并如實加蓋單位公章、身份證復印件、1寸黑白大頭照片2張、報到證復印件、戶口卡及遷移證。 辦理地點:海淀科技大廈七層、海淀人才服務(wù)中心上地分部、海淀人事局業(yè)務(wù)綜合受理大 廳人才服務(wù)中心窗口 第二步:到海淀區(qū)人事局流動調(diào)配科報到 所需材料: 1、海淀人才開具的轉(zhuǎn)入通知; 2、報到證; 3、戶口遷移證; 4、北京市人事局接收函復印件; 5、存檔費等收費收據(jù)的復印件。 辦理地點:海淀區(qū)人事局二層畢業(yè)生審批窗口(蘇州街乙29號) 第三步:到北京市人事局大學生處報到 所需材料: 1、海淀區(qū)人事局開具的落戶介紹信; 2、北京市人事局接收函復印件; 3、戶口遷移證。 辦理地點:東城區(qū)臺基廠三條三號北京市人事局大學生處 第四步:到海淀分局開具落戶通知單 所需材料: 1、海淀區(qū)人事局開具的落戶介紹信; 2、北京市人事局開具的落戶介紹信; 3、戶口遷移證。 辦理地點:中關(guān)村科技園服務(wù)中心144窗口(阜成路67號,空軍總醫(yī)院對面)。然后到海 淀人才服務(wù)中心辦理手續(xù) 以上北京戶口知識轉(zhuǎn)自Zol_泡泡szc的博客
            posted @ 2010-04-05 10:43 chaosuper 閱讀(258) | 評論 (0)編輯 收藏

            僅列出標題
            共12頁: 1 2 3 4 5 6 7 8 9 Last 
            无码人妻精品一区二区三区久久| 一级做a爰片久久毛片看看| 69久久精品无码一区二区| 91麻豆精品国产91久久久久久| 久久福利片| 亚洲av伊人久久综合密臀性色| 色成年激情久久综合| 亚洲综合熟女久久久30p| 99久久精品毛片免费播放| 欧洲性大片xxxxx久久久| 精品人妻久久久久久888| 色婷婷久久综合中文久久一本| 97久久精品国产精品青草| 日产久久强奸免费的看| 伊人色综合久久天天| 亚洲va久久久噜噜噜久久男同| 久久人人爽人人精品视频| 亚洲一区中文字幕久久| 久久99国产综合精品免费| 久久精品一区二区三区AV| 国内精品久久久久影院网站| MM131亚洲国产美女久久| 一本色道久久99一综合| 久久精品视频一| 青春久久| 亚洲日本久久久午夜精品| 日批日出水久久亚洲精品tv| 99久久www免费人成精品| 国产精品天天影视久久综合网| 久久久久亚洲AV无码麻豆| 精品国产99久久久久久麻豆| 日本五月天婷久久网站| 青春久久| 久久人人爽人人爽人人片AV不 | 久久影院亚洲一区| 久久av高潮av无码av喷吹| 国产激情久久久久影院小草 | 久久笫一福利免费导航| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 亚洲综合久久综合激情久久 | 国内精品久久久久久久97牛牛|