1. 什麼叫編程函數他有什麼作用c++的結構是怎樣的
我下面說的就是函數的定義,如果你不能完全理解的話我建議你先看看下面的C語言結構,不然別人再怎麼給你解釋你也聽不明白:(
在某個變化過程中,有兩個變數x、y,如果給定自變數x一個值,那麼應變數有且只有一個變數與之對應,那麼我們稱y是x的函數。
人們對C++有許多不同的看法,保守的C++程序員堅持用其他語言創建COM組件,他們認為只有真正的程序員使用C++。另一方面,VB程序員認為C++是一種很難掌握和使用的語言,沒有必要增加編程時間和進行艱難的嘗試。Java程序員認為他們比C++程序員強,因為James Gosling(Java的發明者)吸收了許多語言(包括C++ )的優點發明了Java,本章和下一章的目的就是消除對C++的偏見和錯誤概念。
本章集中介紹用C++ 建立伺服器組件,不講述C++語言,如果想學C++ ,請參閱Ivor.Horton著的《Beginning Visual C++6》,Wrox 出版,書號為ISBN 1-861000-88-X。
本章的主要內容有:
? C++簡史。
? 使用C++原因。
? 從VB移植到C++。
? ATL、STL和MFC介紹。
? 建立一個COM組件。
? 錯誤處理與調試。
更重要的是應該記住,現在,不只是在用C++建立組件,可以使用Visual C++中可用的任何工具,使得建立過程更加容易。先從C++的起源談起。
17.1 C++語言
在決定是否使用C++語言之前,最好是搞清楚這種語言的實質,讓我們看一下C++的歷史和現狀。
17.1.1 C++簡史
剛開始形成的是C語言,那些想建立更快更有效的代碼的程序員非常欣賞C語言,有一位名叫Bjarne Stroustrup的人卻不滿足於僅僅是生產快速代碼,他想創建面向對象的C語言編程。他開始對C語言的內核進行必要的修改,使其能滿足面向對象模型的要求。C++從此產生。
Bjarne Stroustrup是C++的最初設計者和實現者。它自誕生以來,經過開發和擴充已成一種完全成熟的編程語言。現在C++已由ANSI、BSI、DIN、其他幾個國家標准機構和ISO定為標准。ISO標准於1997年11月4日經投票正式通過。
C++標准演變了許多年。C++模板是近幾年來對此語言的一種擴展,模板是根據類型參數來產生函數和類的機制,有時也稱模板為「參數化的類型」。使用模板,可以設計一個對許多類型的數據進行操作的類,而不需要為每個類型的數據建立一個單獨的類。標准模板庫(Standard Tempalte Library,STL )和微軟的活動模板庫(Active Tempalte Library,ATL )都基於這個C++語言擴展。
C++標准可分為兩部分, C++語言本身和C++標准庫。C++標准庫對於Visual C++是相當新的,實際上微軟只是在發布Visual C++ 5.0時去除了一些「bug」。標准庫提供了標準的輸入/輸出、字元串、容器(如矢量、列表和映射等)、非數值運算(如排序、搜索和合並等)和對數值計算的支持。應該說, C/C++包含了相對少的關鍵字,而且很多最有用的函數都來源於庫,C++標准庫實現容器和演算法的部分就是STL。
STL是數據結構和演算法的一個框架,數據結構包括矢量、列表和映射等,演算法包括這些數據結構的查找、拷貝和排序等。1994年7月,ANSI/ISO C++標准委員會投票決定接受STL為C++標准庫的一部分,這個建議是根據Alex Stepanov、Meng Lee和David Musser這三人的編程和軟體庫研究提出的。STL的產生是為了滿足通用性的設計目標,而不是為了提高性能。
那麼微軟對C++標準的態度怎什麼樣?微軟運行VC++與Plum-Hall C++,想比較得到的分數在92%和93%之間。為什麼不是100%的一個原因是跟蹤這個標准並同時建立一個編譯器比較困難,微軟也考慮了對現有編碼兼容的重要性,有時他們不得不偏離標准以保持這個兼容性。
17.1.2 使用C++的原因
應該有充分的理由使用C++創建伺服器組件,而不只是為了給上司一個好印象才使用C++。如果以前沒用過C++,你必須要盡力學習。
1. 性能
性能有個兩方面,演算法速度和機器代碼效率。一個演算法可以定義為數據通過系統的概念化的路徑,它描述一些點,在這些點上,數據能夠被操作並可轉換產生某個結果。例如,一個演算法定義為獲取一個字元串,計算字元串中的字元個數,並作為結果返回的過程。演算法與
語言是獨立的,所以在編程之前必須設計演算法,編寫一個快速程序的第一個步驟是設計良好的演算法,能以最少的操作步驟得出問題的答案。第二個步是選擇語言,這也影響程序的速度。
從性能的角度考慮,用匯編語言編寫程序是最佳的選擇,它是計算機能理解的自然語言。但是,幾乎沒有人用匯編語言編寫完整的程序,因為這樣做極其乏味。另一個最佳的選擇是C語言。然而,由VC++提供的所有工具都產生C++,而不是C。使用VC++的向導可以生成大量的使用代碼,而不必人工地編寫代碼。從編寫程序的難易程度和程序的性能綜合考慮, C++是最佳的選擇。
C++性能良好,因為它被編譯為機器代碼。對於VBScript和Java等語言,代碼在運行時由程序解釋,而且每次運行程序時都要將代碼轉換為機器碼,這樣做效率比較低,不僅僅是已編譯過的C++程序運行得較快,而且微軟C++編譯器已存在多年。這意味著微軟的編譯器程序員已經把許多優點集中到編譯器上,以致於它能產生非常高效的機器碼。因為C++是編譯語言,而且非常自然,比VB更接近機器代碼,所以由C++編譯器產生的代碼一定比VB的編譯代碼效率更高。
2. 錯誤處理
一個好的程序與一個偉大的程序的區別就是其是否具有良好的錯誤處理支持。實際上,如果在實現中首先進行錯誤處理,而不是在最後才進行,那麼整個程序的開發和測試過程會更加完美。但是,錯誤處理只能與語言所支持的內容相一致。
VBScript具有基本的錯誤處理支持功能。在默認情況下,不能捕獲VBScript中的錯誤。每次懷疑產生錯誤時,要調用On Error Resume Next功能,並檢查Error對象。
而C++中的錯誤處理比較好,這是因為有「異常處理」,本章的後面部分將詳細介紹。
3. 最小的依賴性
正如上面所說,C++是一種編譯語言,即C++代碼在執行之前已轉換為機器碼。只要此代碼不依賴於外部的動態鏈接庫(DLL),C++就可以在不需要安裝額外程序的情況下移動到運行同樣操作系統的其他機器和微處理器上,而移動Java程序時需要先安裝Java運行期庫。
4. 利用現有的代碼
由於C和C++已經存在許多年了,現在有許多可利用的代碼,你的伺服器組件可以使用現有的C/C++代碼或庫。例如統計庫和到老系統的C介面。
5. 最大化COM特徵
COM與C++很接近,實際上, Don Box(COM的權威)在他的《Essential COM》一書的第一章寫道:「COM就是更好的C++」。他說明了COM規范是如何從C++語言規律中產生出來的。通過理解C++,會對COM有更深的理解。
某些語言不能利用所有的COM特徵,而在C++中,幾乎可以使用所有的COM特徵。
17.1.3 不使用C++的原因
知道什麼時候使用C++是重要的,同樣,知道什麼時候不使用C++也是重要的。想像一下那些長期維護代碼的人,如果他們中沒有一些C++程序員支持C++,那麼開發者們不得不把眼光轉向另外一些他們熟悉的語言。
改變C++組件時,為了看到這些改變的結果,必須重新編譯該組件代碼,這會花費很長的開發時間。C++不能像ASP頁面代碼那樣,只使用記事本,改變代碼的一行,重新裝載而得到結果。因此,如果某些工作需要經常變化(如原型),不要用C++。
在C++中,對一些致命的錯誤不能獲得更多的保護,寫一個使組件崩潰的代碼是很容易的。這是為了提供快速代碼而付出的代價, C++不會停下來去檢查代碼是否按設計運行能否使程序不崩潰依賴於開發者的技巧。如果在這方面花的時間較少或剛剛學習C++,最好不要使用C++。等到已經意識到C++中所有容易犯的錯誤,而且在檢測組件之前花了許多時間,才可以使用C++,如果想很快、很容易地建立一個組件,而且也不考慮該組件的執行速度,那麼使用VB吧!
17.1.4 把ASP技巧轉到C++上
學習新東西的最好方法就是利用現有的技巧。對於ASP開發者來說,已經學習了C++所要求的許多技巧,特別是,JScript語法和ActiveX或COM的面向對象編程的概念。
1. JScript
大部分ASP開發者都用JScript在瀏覽器上使用DHTML。JScript的語法與C非常相似,所以,如果懂得JScript,那麼就懂得基本的C語法。當然,只是C++語法的子集。C++有許多額外的語法來支持面向對象編程,這就是我們下一步要做的。
2. 面向對象編程
如果你在VB中使用過類(class),則對任何COM對象和文檔對象模型(Document ObjectModel,DOM )都應熟悉,因為已經有了面向對象編程(OOP)的概念。在前面已經說過, C和C++的區別是C++支持面向對象編程。
2. C和VC++,TC到底是怎麼回事。還有好多函數在VC上沒定義不能使用。 我一直有個問題就是:
這兩個語言能一起寫嗎?可以,但是源文件應該為CPP。
那麼在TC下的一些標准函數不能用了,那應該在VC中有相應的函數替代吧?像 "bioskey",頭文件中的一些其它?
不一定。首先要分清楚函數的種類,第一、標准C有它自己的標准函數庫,主要是數學運算和字元操作等等,這些函數一般的編譯器都應該包含和支持。第二、由操作系統提供的函數,包括圖形界面函數和系統功能調用函數等等。有這些函數我們才能生成程序的界面和實現各種功能。第三、各個編譯器還有它自己特有的函數庫,這些函數有些是由操作系統相應的函數封裝起來的。比如TC的圖形函數庫,不屬於C標准函數庫,VC上就沒有,如果控制台程序代碼中含有TC的圖形函數庫里的函數,VC就無法編譯成功。但是VC有自己的圖形操作函數對應於TC的圖形操作函數。標准C不會提供與程序界面有關的函數,因為這些函數必然是與操作系統掛鉤的,相同的界面,linux和windows下實現的函數肯定不同。
C是一種面向過程語言,c++可以粗略理解為C的超集,它在C的基礎上引入了面向對象思想,還有STL,模板等等很多概念和技術,C++比C復雜了很多很多,C語言你可能一個星期就可以入門,但是C++至少要學一個月。無論是linux和windows平台都可以用C和C++進行程序開發,雖然會比較繁瑣。在windows下,C和C++通過使用API函數來開發應用程序。
vc++是一個基於C和C++語言的在windows平台下開發應用程序的編程工具。本質上,它和用C和C++編程沒有區別,但是它使得開發應用程序變得簡單多了,主要是它對API進行了封裝(比如用C語言實現某個功能需要用3個API函數,而vc++把這3個函數封裝到一個新的函數里,我們要實現某個功能就只要調用這個新的函數就行了),再加上一大堆類,就形成了MFC(微軟基礎類庫),此外vc++把程序界面設計變得容易了,可以直接通過拖拽來控制控制項和界面(用c語言則需要寫代碼來生成界面,既繁瑣,又易出錯)。此外,VC++對windows消息處理方式也進行了一些改變,使得消息處理變得簡單。一個只有一個窗口,什麼功能都沒有的程序,如果你採用C來編寫,要寫幾十行代碼,包括窗口的生成和消息處理函數。而用VC++,你可以不用寫一行代碼或很少代碼就行了。
對C簡單掌握,譚浩強的C語言教程,想繼續深入,看《C專家編程》。
對C++簡單掌握,推薦白喬的《標准C++開發入門與編程實踐》,想系統學C++,推薦先學《C++ Primer》,接著看STL等等很多方面的書。
對vc++,學vc++前一定要知道windows下程序運行原理,包括一些window下程序設計的概念(實例、句柄、一些對象的數據結構等等)、消息處理過程等等,然後自己用C語言和API函數編寫一個只有一個窗口的最簡單的windows應用程序。書推薦Petzold的《windows程序設計》,想簡單學,看前三章就行,否則就推薦把整本書學完。接著就可以看VC++的書了,推薦孫鑫的《VC++深入祥解》,學完,你的VC++就算入門了。
3. 編譯器內部使用了哪些技術
編譯器是一種將高級語言代碼轉換為機器語言代碼的工具。在編譯器內部,使用了許多技術來實現代碼的轉換和優化。
其中一些常見的技術包括:
詞法分析器(Lexer):將源代碼轉換為一個個標記(Token),並去除無用的空格和注釋。
語法分析器(Parser):將標記轉換為抽象語法樹(AST),並舉隱檢查語正虛廳法是否正確。
語義分析器(Semantic Analyzer):對AST進行分析,檢查變數、函數、類型等是否符合規范,並進行類型檢查等操作。
優譽早化器(Optimizer):對生成的機器語言代碼進行優化,以提高代碼的執行效率和空間利用率。
代碼生成器(Code Generator):將優化後的代碼生成可執行的機器語言代碼。
調試器(Debugger):用於調試生成的代碼,可以在代碼執行過程中進行斷點調試、變數監視等操作。
編譯器內部使用這些技術,可以提高代碼的執行效率、減少代碼出錯的概率,並方便程序員進行調試和維護。
碼字不易,希望能幫到您! 求採納...
4. 我在VB的Timet中使用了option顯示編譯錯誤,提示子程序或函數未定義怎麼回事
如果是編譯錯誤,一些子函數或者函數未定義,那必須要重新整理之後才能使用