例子:
環境:linux
編譯器:gcc
源碼:hello.c
1 #include <stdio.h>
2
3 int main()
4 {
5 printf("hello, world\n");
6 }
:~$ gcc -o hello hello.c
1、 源碼文件
hello.c 通過預處理器->修改過的源碼文件
hello.i 2、
hello.i 通過編譯器->匯編代碼
hello.s 3、
hello.s 通過匯編器->浮動文件
hello.o 4、
hello.o+printf.o 通過連接器->可執行文件
hello。1、
預處理階段 預處理器(cpp)根據#后面的指令修改源代碼。例:
hello.c中的#include <stdio.h> 命令告訴預處理器把系統頭文件stdio.h插入到程序中生產另外一個C程序,一般后綴名為.i。
2、
編譯階段 編譯器(cc1)把
hello.i文件轉化成匯編代碼
hello.s文件。
3、
匯編階段 匯編器(as)把
hello.s轉化成機器語言指令浮動文件程序
hello.o。4、
連接階段 hello程序調用了標準C庫printf函數。連接器(ld)把
printf.o和hello.o連接成
hello可執行文件。
posted @
2012-05-24 14:10 canaan 閱讀(2340) |
評論 (2) |
編輯 收藏
本書的目標讀者是那些希望自己變得更有效、更多產的程序員?;蛟S你在因為不能實現自己的潛力而沮喪?;蛟S你看到你的同事使用來使它們比你更多產。也許你當前的工作使用比較老的技術,你想知道怎樣把教新的思想應用于你的工作。
我們不會假裝擁有所有(或大部分)的答案,我們的觀念也不會適用于所有的情況。我們所能說的只是,如果你遵循我們的方法,你將會快速的獲得經驗,你的生產力將會提高,會對整個開發過程更加理解。你將能編寫更好的軟件。
posted @
2012-04-17 12:40 canaan 閱讀(1797) |
評論 (0) |
編輯 收藏
序言
本書將會幫助你成為一個
更好的程序員。
不管你是個人開發者,還是大項目團隊中的一員,或者是同時為很多客戶共事的顧問。本書將會幫助你,作為一個人體,更好地完成工作。本書不是理論書籍--我們專注于實際問題,利用你的經驗作出更有見識的決定。pragmatic詞來自拉丁語的pragmaticus--“商業技巧”--后者又源于希臘(...),意思是“去做。”這是一本關于“去做(doing)”的書。
編程是一門手藝。用最簡單的話來說就是讓計算機做你(或者用戶)想讓它做的事情。作為一個程序員,你既是聆聽者,又是顧問,既是翻譯員,又是專制者。你嘗試著捕捉這些難以捉摸的需求,用一種方法來描述它們,讓一臺純粹的機器能夠合理的處理它們。你嘗試著記錄你的工作,以使他人能夠理解它;你還嘗試著策劃你的工作,以使他人能夠在上面構建。另外,你嘗試著在項目時鐘的冷酷地催逼下完成這些工作。你每天都在創造小奇跡。
這是一個困難的工作。
很多人聲稱要給你提供幫助。工具供應商吹捧他們的產品所展現出來的奇跡。方法學大師承諾他們的技術保證有效。每個人都聲稱他們的編程語言是最好的,而每個操作系統都是這些問題的可信賴的解答。
當然,這些都不是真的。沒有這么簡單的答案。不存最好的解決方案,無論是工具,語言,或者一個操作系統。而存在的只是在某些特定的環境下更為合適的系統。
這就是務實的開始。你不應該局限于任何特定的技術,而是應該擁有足夠寬廣的背景和經驗基礎來為特定的情況選擇一種好的解決方案。你的背景源自于對計算機科學基本原則的理解,你的經驗來自于廣泛的實際項目。理論與實踐的結合使你變得強大。
你調整方法來適應當前的情形與環境。你判斷這些所有因素中相對重要的因素來影響項目,使用你的經驗來制作適合的解決方案。你隨著工作的進展持續著這些活動。
務實的程序員不僅要完成工作,而且要做的漂亮。
posted @
2012-04-17 12:01 canaan 閱讀(1719) |
評論 (0) |
編輯 收藏
《The Pragmatic Programmer》 From Journeyman to Master
《務實的程序員》 從工人到大師
或《程序員修煉之道》 從小工到專家
作者: 【美】 Andrew Hunt David Thomas
出版社: Addison Wesley
第一版 1999年10月13日
務實的程序員通過現代軟件開發中日益增長的的規范和技術細節來檢查核心過程--根據需求來創建用戶可工作和樂于維護的代碼。本書包含了個人責任到職業發展到用架構技術來保持你的代碼靈活,易于修改和重用。閱讀本書,你將會學到:
為軟件變質做斗爭;
避免重復知識陷阱;
編寫靈活,動態,和易適應的代碼;
避免靠巧合編程;
用合約,斷言,和異常來保護你的代碼;
捕捉真實的需求;
嚴格并且有效地進行測試;
讓你的用戶開心;
組建務實程序員團隊;和
用自動化使開發過程更精確。
本書由一系列獨立的章節組成,其間充滿了有趣的軼事,周到的例子,和有趣的模擬,《務實的程序員》描述了軟件開發的許多不同方面的最佳實踐和主要問題。不管你是新手,還是有經驗的程序員,或者是對軟件項目有責任的經理,通過每日學習這些課程,都將會在個人生產力,準確性和工作滿意度快速提升。你將會學到技能和開發習慣和態度為你的職業生涯中取得長期成功奠定基礎。你將會成為一個務實的程序員。
posted @
2012-04-17 10:26 canaan 閱讀(1781) |
評論 (0) |
編輯 收藏
CColorDialog Class 顏色對話框類VS2008允許你將顏色選擇對話框加入到你的應用程序中。
class CColorDialog : public CCommonDialog
備注CColorDialog對象是一個具有一列定義在顯示系統中的顏色的對話框。用戶可以從列中選擇或者創建特定的顏色,在對話框退出時報告返回給應用程序。
使用提供的構造函數或派生一個新類然后使用你自己的構造函數,來構建一個
CColorDialog對象。
一旦對話框創建完成,你可以設置或修改
m_cc結構中的任何值來初始化對話框控件的值。該m_cc結構類型是
CHOOSECOLOR. 。
初始化對話框控件后,調用
DoModal成員函數來顯示對話框,并允許用戶選擇一種顏色。
DoModal返回用戶的選擇對話框的OK(
IDOK)或者Cancel(
IDCANCEL)按鈕。
如果
DoModal返回IDOK,你可以使用
CColorDialog方法來找回由用戶輸入的信息。
你可以使用Windows
CommDlgExtendedError函數來決定不管錯誤發生在對話框初始化過程中并了解更多有關的錯誤。
CColorDialog依賴COMMDLG.DLL文件映射Windows版本3.1更高版本。
從CColorDialog派生一個類,自定義對話框。提供自定義對話框模板,并添加消息映射來處理從擴展控件來的通知消息。任何未處理的消息應該傳遞給基類。
筆記:如果你使用框架使其他對話框對象變成灰色,在某些
CColorDialog安裝對象將不顯示一個灰色背景。
使用
CColorDialog需要更多的信息,參見
Common Dialog Classes。
需求頭文件:afxdlgs.h
只能設備開發筆記
這個類只支持Windows CE標準SDK。它不支持Windows Mobile Pocket PC或者智能手機平臺。智能設備版本CColorDialog類不支持下面方法:
參見概念
posted @
2012-04-05 19:17 canaan 閱讀(2781) |
評論 (0) |
編輯 收藏
隨機訪問容器容器類目:容器
描述隨機訪問容器是一個迭代器類型為隨機訪問迭代器的
可逆容器。它提供常量緩沖時間來訪問隨機元素。
改善自可逆容器相關類型除了定義在
可逆容器中的類型,沒有其他額外類型。盡管這個迭代器類型的需求加強了:必須是隨機訪問迭代器。
標記法X 隨機訪問容器模型類型
a,b X類型對象
T X類型的值
定義有效表達式除了定義在
可逆容器中的表達式外,下面的表達式也必須有效。
名稱 表達式 類型需求 返回類型
Element access(訪問元素) a[n] n可以轉換成size_type 如果可變,那么是引用,否則為常量引用
表達式語義一個表達式的語義只在這個情況下定義,當他在
可逆容器中沒有定義,或者有額外的信息。
名稱 表達式 前提 語義 后置
Element access(訪問元素) a[n] 0<=n<a.size() 返回容器的第n個元素
復雜度保證訪問元素的運行時復雜度為緩沖常量時間。
不變量Element access(訪問元素) a[n]返回的元素與增加a.begin()n次得到的結果迭代器解引用是一樣的。
模型vector
deque
注釋參見Iterator overview,隨機訪問迭代器,Sequence
posted @
2012-03-31 13:52 canaan 閱讀(1839) |
評論 (0) |
編輯 收藏
摘要: 如何設置MFC狀態欄?如何在狀態欄添加圖片?怎樣修改狀態欄字體顏色?狀態欄編程,如何使用狀態欄?
閱讀全文
posted @
2012-03-30 22:43 canaan 閱讀(4466) |
評論 (0) |
編輯 收藏
CBitmapButton 類
創建位圖圖像替代文本標記的按鈕控件。
Class CBitmapButton : public CButton
備注
CBitmapButton 對象包含多達四個位圖,為按鈕的不同狀態包含圖像:up(or normal),down(or selected),focused,和disabled
。只有第一個位圖是必須的;其他都是可以選擇的。
位圖按鈕(Bitmap-button)圖像包括圖像的邊框以及圖像本身。邊框通常扮演部分顯示按鈕的狀態。例如,focused狀態下的位圖通
常和up狀態下的一樣,但是它的邊框是矩形虛線或者粗實線。disabled狀態下的位圖通常類似于up狀態但是對比度較低(如暗灰色
或者灰色菜單選擇)。
這些位圖可以是任意大小,但是對于up狀態它們都被視為同樣大小。
各種應用要求位圖圖像的不同組合:
Up Down Focused Disabled 應用
* 位圖
* * 沒有WS_TABSTOP樣式的按鈕
* * * * 帶有所有狀態的對話框按鈕
* * * 帶有WS_TABSTOP樣式的對話框按鈕
當創建一個位圖按鈕控件,設置BS_OWNERDRAW樣式指定按鈕為自己繪制的。這使Windows為按鈕發送WM_MEASUREITEM和WMDRAWITEM
消息??蚣転槟闾幚磉@些消息和管理按鈕的外觀。
在windows客戶區域創建位圖按鈕控件
1、為按鈕創建一到四個位圖。
2、構建CBitmapButton對象。
3、調用Create函數創建按鈕控件,然后附加到CBitmapButton對象上。
4、當位圖按鈕構造好后,調用LoadBitmaps成員函數來加載位圖資源。
一個對話框中包括一個位圖按鈕
1、為按鈕創建一到四個位圖。
2、創建一個帶有自繪(owner-draw)按鈕的對話框模板,按鈕放置在你想要的位圖按鈕的地方。
3、設置按鈕的caption為"MYIMAGE",按鈕定義符號為IDC_MYIMAGE。
4、在你應用程序的資源腳本中,在步驟3中為每個為按鈕創建的圖形設置標題為ID加一個字母,"U","D","F",或者"X"(對應于up,down,focused,和disabled)的字符串。例如,像標題為"MYIMAGE"的按鈕,它們的ID為"MYIMAGEU","MYIMAGED","MYIMAGEF",和"MYIMAGEX."你必須指定位圖的ID要有雙引號。否則資源編譯器將制定一個整數的資源,那么MFC在加載圖片時就會失敗。
5、在你的應用程序的對話框類(繼承自CDialog)中,增加一個CBitmapButton成員對象。
6、在CDialog對象的OnInitDialog例程中,調用CBitmapButton對象的AutoLoad函數,按鈕控件的ID和CDialog對象的指針作為參數。
如果你想處理窗口信息,像BN_CLICKED,位圖按鈕控件發送給它的父(通常是一個從CDialog派生的類),為CDialog派生對象增加一個消息映射入口,和每個消息處理成員函數。CBitmapButton對象發送的通知跟CButton是一樣的。
類CToolBar對位圖按鈕采用不同的方法。
更多關于CBitmapButton的信息,參考Controls。
要求
頭文件:afxext.h
參考
CTLRLTEST sample:Implements Custom Controls
CBitmapButton Members
CButton Class
Hierarchy Chart
原文:
http://msdn.microsoft.com/zh-cn/library/a3y45xs0(v=vs.90).aspx
posted @
2012-03-22 10:36 canaan 閱讀(1827) |
評論 (0) |
編輯 收藏
可逆容器(Reversible Container)
類目:容器描述可逆容器是一個有雙向迭代器的前向容器。它可以向后向后迭代通過容器。
改善自Forward Container相關類型介紹了兩個新的類型。此外,迭代器類型和常量迭代器類型必須滿足比前向容器(
Forward Container)更嚴格的要求。迭代器類型和反向迭代器類型必須是雙向迭代器(Bidirectional Iterators),而不僅僅是前向迭代器(
ForWard Iterators)。
反向迭代器類型(Reverse iterator type) X::reverse_iterator 一個反向迭代器適配器的基迭代器類型是容器的迭代器類型。遞增反向迭代器(rever_iterator)類型對象向后移動通過容器:Reverse Iterator適配器映射了++操作符和--操作符。
常量反向迭代器類型(Const reverse iterator type) X::const_reverse_iterator 一個反向迭代器適配器的基迭代器是容器的常量迭代器類型。[1]
標記法X 反向容器模式類型
a,b 類型X對象
定義有效表達式除了前向容器(
Forward Container)中的表達式外,下面的表達式也必須有效
名稱 表達式 類型要求 返回類型
范圍起始Beginning of range a.rbegin() 如果a是可變的,那么是reverse_iterator,否則為const_reverse_iterator[1]
范圍結束End of range a.rend() 如果a是可變的,那么是reverse_iterator,否則為const_reverse_iterator[1]
表達式語義一個表達式的語義只有在這種情況下定義,當它沒有在前向容器(
Forward Container)中定義,或者有額外的信息。
名稱 表達式 前提 語義 后置
逆向范圍起始Beginning of range a.rbegin() 相當于X::reverse_iterator(a.end())。 a.rbegin()是提領或者是past-the-end。當a.size() == 0是,它為past-the-end。
逆向范圍結束End of reverse range a.rend() 相當于X::reverse_iterator(a.begin())。 a.rend()是past-the-end。
復雜性保證rbegin()和rend()運行時復雜性是攤銷時間為常數。
不變因素有效范圍 [a.rbegin(), a.rend())是一個有效范圍。
等待范圍 a.begin()到a.end()之間的距離和a.rbegin()到a.rend()之間的距離是一樣的。
模型vector
list
deque
注釋[1]一個容器的迭代器類型和常量迭代器類型有可能是相同的類型:一個容器不需要提供可變的迭代器。因此反向迭代器類型和常量反向迭代器類型也可能是相同的。
參見
Iterator overview, Bidirectional Iterator, Sequence
posted @
2012-03-21 16:07 canaan 閱讀(1469) |
評論 (1) |
編輯 收藏
前向容器(Forward Container)
容器
類目:容器
描述
前向容器中的元素是按一定的順序排序的:這個順序不會因為迭代而自動改變。一定的順序要求允許定義相等的元素(如果容器中的元素是可以比較相等的Equality Comparable)和字典序(如果容器中的元素類型是可以比較小于的 LessThen Comparable)。
前向容器中的迭代器滿足前向迭代器的要求:因此,前向容器支持多通道算法,并允許同一個容器可以同時擁有多個激活的迭代器。
完善(Refinement of)
Container,EqualityComparable,LessThanComparable
相關類型
除了容器總定義的,沒有其他額外的類型。然而,迭代器類型的要求加強:迭代器類型必須是前向迭代器模式。
標記法
X 是一個前向容器模式的類型
a,b 類型X的對象
T 類型X的值
定義
有效表達式
除了容器中定義的表達式外,EqualityComparable,和LessThanComparable,下面的表達式必須是有效的。
名字 表達式 類型要求 返回類型
等式(Equality) a == b T是EqualityComparable 可轉換成bool
不等式(Inequality) a != b T是EqualityComparable 可轉換成bool
小于(Less) a < b T是LessThanComparable 可轉換成bool
大于(Greater) a > b T是LessThanComparable 可轉換成bool
小于或等于(Less or equal) a <= b T是LessThanComparable 可轉換成bool
大于或等于(Greater or equal)a >= b T是LessThanComparable 可轉換成bool
表達式語義
一個表達式的語義只有在這種情況下定義,當它沒有定義在Container, EqualityComparable, 或者LessThanComparable,或者有額外的信息。
名字 表達式 前提 語義 后置
等式(Equality) a == b 如果a.size() == b.size()而且a中的每個元素都等于b中的對應的元素,那么返回true。否則返回false。
小于(Less) a < b 相當于lexicographical_compare(a,b)
復雜性擔保
等式和不等式的操作與容器的大小呈線性關系。
不變
順序 兩個不同的迭代器迭代一個前向容器的,都是以同樣的順序訪問它的元素,提供一個沒有干預性的操作。
模型
vector
list
slist
deque
set
hash_set
map
hash_map
multiset
hash_multiset
multimap
hash_multimap
注釋
參見
iterator overview, Forward Iterator, Sequence
posted @
2012-03-19 12:10 canaan 閱讀(1217) |
評論 (0) |
編輯 收藏