版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Visual C+ 2010入門教程系列一:關(guān)于Visual Studio、VC和C+的那些事寫在前面 在我還在上學(xué)的時候,我選擇了C+,最初我用VC6作為我的IDE,我看過很多本C+的教材,有的適合我,有的不適合我,其中有一本叫Visual C+ 2005入門經(jīng)典的書幫了我不少的忙。因為通常的C+教材都只會介紹C+的語法什么的,很少會告訴我們?nèi)绾稳ゾ幾g、運行,告訴我們什么是控制臺程序,什么事Win程序,什么是GUI程序,C+能干什么,VC和C+的區(qū)別是什么?,F(xiàn)在有很多的朋友應(yīng)該也有這些問題吧? 學(xué)C+用C+也有幾年了,算不上熟悉,算是初窺門徑吧,我想我應(yīng)該做點什么幫助一下那些和曾經(jīng)的我一樣困
2、惑的朋友,特別是學(xué)生朋友,告訴他們他們所困惑的問題的答案。記得我學(xué)C+的時候,沒有人教,有的時候也走了不少彎路,甚至連調(diào)試也不會,也不知道可以通過看調(diào)用堆??凑{(diào)用次序,還自己慢慢的去搜索,好傻啊。 接下來我會做一個Visual C+ 2010入門教程系列,用來幫助初學(xué)者。剛開始學(xué)的時候是很痛苦的,這個我深有體會,特別是身邊還沒有人能夠指導(dǎo)一二的。內(nèi)容主要涵蓋在Windows下面使用C+進行開發(fā)的常見內(nèi)容,Visual Studio 2010的使用,如何創(chuàng)建新項目,如何調(diào)試,如果配置項目屬性等等,另外還會介紹Visual C+ 2010中新加如的一些內(nèi)容,包括一些新的STL組建,一些新的語法支持
3、等等。 由于本人水平有限,其中難免有錯誤,希望大家諒解,如果大家有發(fā)現(xiàn)問題還請務(wù)必及時指出來,否則誤導(dǎo)了他人我就罪不容恕了。 注意,本教程非C+教程,不會教你C+,只會教你如何使用 Visual C+ 2010去練習(xí)去學(xué)習(xí)其它C+教材上面的程序。因此建議大家認真的去看其他的C+教程,在使用Visual C+ 2010實踐的時候如果遇到問題可以到這里來參考。推薦C+ Primer、C+程序設(shè)計語言Visual C+ 2008入門經(jīng)典。 第一章: 關(guān)于Visual Studio、VC和C+的那些事 首先,這三個東西有什么區(qū)別呢?VC和C+是相同的嗎,有什么區(qū)別呢?我剛開始學(xué)C+的時候也有這樣的問題
4、,在這里我來替大家解釋一下他們到底是什么。 Visual Studio,我們一般都簡稱為VS,VC全稱是Visual C+,C+就不用解釋了吧?Visual Studio其實是微軟開發(fā)的一套工具集,它由各種各樣的工具組成,這就好像Office 2007是由Word 2007、Excel 2007、Access 2007等等組成的一個道理。其中Visual C+就是Visual Studio的一個重要的組成部分。Visual Studio可以用于生成Web應(yīng)用程序,也可以生成桌面應(yīng)用程序,在Visual Studio下面,除了VC,還有Visual C#,Visual Basic,過去還有Vis
5、ual J#,現(xiàn)在還有Visual F#等等組件工具,使用這些工具你可以使用C+語言、C#語言或者Basic語言(微軟改進版)進行開發(fā)。這就好比桌上放著刀、叉、筷子,你可以用它們來吃飯,無論你用什么工具都可以,因為它們都是餐具的一種。 VC,全稱是Visual C+,它只是一個工具而已。 C+是一門和C、Basic、C#、Java一個概念的東西,它是一門語言,這個概念就同漢語、英語、法語之間的關(guān)系一樣。語言的可以不同,他們有的復(fù)雜有的精簡,比如漢語,我個人認為這是這個星球上最復(fù)雜的語言;又比如電影阿凡達中外星人使用的語言,不過100都個單詞而已。當(dāng)然,語言并沒有高低貴賤之分,而對語言掌握的好不
6、好,說的好不好是有高下之別的。 一個語言都有哪些要素呢?語法就是其中一個重要的方面,比如你要對你所喜歡的人表達愛慕之情,那么你應(yīng)該說“我愛你”,你不能說“你愛我”,因為這搞錯了主謂賓關(guān)系,因此我們通常都需要按照一定的規(guī)矩和原則表達才會讓別人正確理解我們真正的含義。在我們的漢語中有一些成語,它們通常都比較簡單短小,但是卻能表達非常強烈的感情,而且效果非常好。比如你想罵一個壞人“你實在是太變態(tài)了,這種事情都干得出來。”你可以這樣說:“你也太禽獸不如了!”對于編程的語言來說,其實也是有成語的,在我看來,這就是庫函數(shù)。通常我們在編程的時候都推薦選擇庫函數(shù),因為它通常會比較快一些。 一直以來都有不少人混
7、淆Visual C+和Visual Studio,其實最初Visual C+發(fā)布的時候還沒有Visual Studio這個東西,Visual C+是一個獨立的開發(fā)工具,與Visual Basic等并列,最后微軟將它們整合在一起組成了Visual Studio。 Visual C+從發(fā)布起到現(xiàn)在已經(jīng)有10個大版本了,我們這里介紹的Visual C+ 2010就是Visual C+ 10,簡稱VC10。上朔10多年,Visual C+ 6.0發(fā)布了,這個被稱為史上最經(jīng)典的VC,現(xiàn)在有很多企業(yè)還在用它,大量的教材基于這個版本的VC來寫的。然而實際上VC6并沒有想象中的那么美好,孱弱的IDE,不完善的
8、STL等等讓它越來越不適應(yīng)時代的發(fā)展,同時由于后來的版本和它的差別越來越大,讓很多習(xí)慣于VC6教材的人在新版本上無所適從。VC6走向歷史的終結(jié)點其實是必然的,只在于時間問題罷了,況且大部分人都有追求最新的“嗜好”,所以這里也選擇最新版的VC來做入門教程。 下面來介紹下這個VC版本和VS版本的對應(yīng)關(guān)系: Visual Studio .net (2002) - Visual C+ .net (2002) - Visual C+ 7.0 - _MSC_VER值1300 這個是微軟推出.net戰(zhàn)略之后的最早的一個版本的VC,這個版本相對VC6來說變化并不是很大,一些不標(biāo)準(zhǔn)的語法依然得到支持,不過IDE
9、界面已經(jīng)出現(xiàn)了VS時代的雛形。 Visual Stuido .net 2003 - Visual C+ .net 2003 - Visual C+ 7.1 - _MSC_VER值1310 這個版本我覺得只能算是一個對.net 2002的一個Patch版本,解決了一些Bug,不規(guī)范的語法依然得到支持,比如for循環(huán)變量作用域的問題。 Visual Studio 2005 - Visual C+ 2005 - Visual C+ 8.0 - _MSC_VER 1400 這個版本算是一個比較符合C+標(biāo)準(zhǔn)的VC版本了,微軟為這個版本的VC加入了大量的增強版的C庫函數(shù)(CRT函數(shù)),如strcpy_s之
10、類,當(dāng)然,這部分并不是C和C+標(biāo)準(zhǔn)所要求的。 Visual Studio 2008 - Visual C+ 2008 - Visual C+ 9.0 - _MSC_VER 1500 這個版本應(yīng)該是在Vista發(fā)布之后出的,如果你是在Vista或者Win7下面使用,那么應(yīng)該選擇這個版本。這個版本與VC2005變化并不大,不過它的SP1為C+帶來一些新的STL庫組件(tr1部分),以及MFC下面的Ribbon界面。 Visual Studio 2010 - Visual C+ 2010 - Visual C+ 10.0 - _MSC_VER值1600. 這個就是我們即將要介紹的版本,那么讓我們來看
11、一下它的啟動畫面吧。 這個是Visual Studio 2010中文旗艦版的啟動畫面。下一章中,我將教大家安裝、配置VS2010/VC2010,以及如何使用它來創(chuàng)建第一個C+程序。 如果你沒有下載過Visual Studio 2010的話,那么請你提前下載好它吧:Visual C+ 2010入門教程系列二:安裝、配置和首次使用VS2010 本章將幫助大家安裝Visual C+ 2010,幫助大家做一些常見的配置,以及第一次使用它來寫HelloWord程序。 安裝 Visual C+ 2010是屬于Visual Studio 2010的一部分,這個在前一章中已經(jīng)講解過,實際上Visual C+
12、2010也有更多的子版本,正如Windows7有旗艦版、家庭高級版、家庭初級版一樣。在上一章的下載地址中有兩個版本可以選擇,我選擇的時候旗艦版,這個功能最全面。 如果你下載完畢了,應(yīng)該有一個ISO鏡像文件,如果你是從我給的地址下載的,那么那個序列號已經(jīng)被 替換成正版序列號,直接安裝即可。下面是ISO文件截圖: 這就是光盤鏡像文件,我們有多種方式可以安裝它,你可以把它燒錄成光盤,也可以用虛擬光驅(qū)軟件安裝它,由于這個ISO已經(jīng)被修改過了,你甚至可以直接解壓它,然后運行里面的setup.exe進行安裝。 這里我使用虛擬光驅(qū)進行說明,首先我假設(shè)你已經(jīng)安裝好了虛擬光驅(qū)軟件DAEMON Tools Lit
13、e,如果你還沒有安裝,請去游俠補丁網(wǎng)下載,因為在那里你總是能找到最新的免費版本。 接下來我們通過虛擬光驅(qū)加載剛才下載好的ISO鏡像: 在彈出的對話框中選擇我們下載好的ISO文件。這個時候,虛擬光驅(qū)里面已經(jīng)替我們打開了ISO文件,有的機器可能會自動彈出安裝提示,有的不會。如果自動彈出安裝提示,那么直接通過即可,如果沒有彈出,那么用資源管理器方式進入虛擬光驅(qū)點擊Setup.exe即可開始安裝。由于我已經(jīng)安裝好了VS2010,所以接下來無法給大家截圖了,我就直接用文字描述吧。 當(dāng)彈出VS2010安裝程序之后點下一步,然后我們可能會看到 完全 最小 自定義 這樣的選項,我推薦大家選擇自定義,因為只有這
14、樣我們才可以自定我們安裝的目錄。接下來會選擇安裝的組件。這個時候我們會看到大量的VS2010的組件,這里我們可以選擇是否安裝Basic是否安裝C#等等,我在網(wǎng)上找到一些圖片,雖然跟中文版2010不一樣,大家大概的樣子是一樣的,大家就湊合著看看吧。 下面是開始的界面,我們應(yīng)該選擇安裝VS2010. 上面這個時候選擇同意。然后安裝包會開始搜集信息: 選擇目錄: 然后就是開始安裝了,注意安裝的時候可能需要重啟一兩次。 最后安裝成功: 配置 當(dāng)安裝成功之后,我們就可以開始使用了,這里我先教大家做一些常見的配置,當(dāng)然大家也可以直接用默認的設(shè)置,我這樣配置主要是為了方便。 下面通過開始菜單來啟動VS201
15、0吧: 如果你是第一次開始,那么可能會讓你選擇默認的環(huán)境設(shè)置,我們要使用VC當(dāng)然選擇VC的配置: 出現(xiàn)下面的畫面表示已經(jīng)成功安裝和運行了。這是起始頁面,以后你會經(jīng)常見到它。注意,你可能會沒有VAssistX這個菜單,因為這個是個外部工具,以后會給大家解釋它的用處,現(xiàn)在暫時忽略。接下來讓我們來做一些常見的設(shè)置。通過菜單工具選項調(diào)出配置對話框,下面是一些常見的設(shè)置: 調(diào)處行號,選擇文本編輯器,所有語言,把行號打成勾。 如果你想調(diào)整字體或者顏色,那么可以在這里選擇: 單擊工具欄的空白區(qū)域,讓我們把生成工具欄調(diào)出來: 這樣我們就可以直接在工具欄上面選擇編譯項目、編譯整個解決方案、運行程序和調(diào)試程序了。
16、選擇生成工具欄旁邊的小三角形可以自定,我們還可以添加一些按鈕: 單擊自定義界面下面的添加按鈕就可以添加新的按鈕了,現(xiàn)在我們把開始執(zhí)行(不調(diào)試)添加工具欄中: 以前經(jīng)常有人問我為什么我的程序閃一下就沒了,這就是因為它們把調(diào)試(F5,那個實心的三角形)當(dāng)成了運行(不調(diào)試,Ctrl+F5,空心帶尾巴的三角形)了。當(dāng)然是一閃而過啦。關(guān)于調(diào)試以后說到。 HelloWorld. 下面讓我們用VC+ 2010也就是VC10來做一個控制臺的HelloWorld程序吧。 VC2010里面不能單獨編譯一個.cpp或者一個.c文件,這些文件必須依賴于某一個項目,因此我們必須創(chuàng)建一個項目。有很多種方法都可以創(chuàng)建項目,
17、可以通過菜單:文件,新建,項目;也可以通過工具欄點擊新建項目進行創(chuàng)建。這里我們點擊起始頁面上面的新建項目: 點擊之后進入新建項目向?qū)В荷厦孢x擇Win32控制臺應(yīng)用程序,名稱中輸入HelloWorld點確定,至于是否為解決方案創(chuàng)建目錄我們暫時不管,那主要區(qū)別在于解決方案是否和項目文件在同一目錄。 接下來進入創(chuàng)建頁面,在Win32應(yīng)用程序向?qū)У牡谝粋€頁面直接點下一步即可: 下個頁面記得選擇空項目,我們不需要預(yù)編譯頭: 點擊完成。 這時候一個空的項目編譯成功了,我們不妨編譯一些試試。點擊剛才添加的生成工具欄的生成按鈕: 這時候我們會遇到編譯錯誤,為什么呢?因為我們還沒有Main函數(shù),對于一個C+項目
18、來說,一定要有一個且僅有一個main函數(shù)(Windows程序需要WinMain,區(qū)別以后再講),可以是隱式提供也可以是顯式提供,至于區(qū)別以后會講到。現(xiàn)在讓我們記住這個錯誤,以后遇到這個錯誤的時候一定要想想,我們項目中是否有Main函數(shù)。注意這時候即使你托一個有Main函數(shù)的文件到VC10中進行編譯也是沒有意義的,因為那個文件并不是我們項目的一部分。 現(xiàn)在我們可以添加一個代碼文件進來了,這個代碼文件可以是已經(jīng)存在的也可以是新建的,這里新建一個。右鍵單擊項目名稱,選擇添加,新建項: 在向?qū)е羞x擇代碼、C+文件(.cpp),名稱輸入Main,確定。 這時候已經(jīng)成功添加了一個Main文件,注意添加新文
19、件的時候要防止重名: 然后我們輸入最簡單的幾行代碼,然后編譯它吧,編譯方法和上面一樣。 如果編譯成功你會看到上面的畫面,如果失敗會有錯誤提示,那么你可以根據(jù)提示去修改項目配置或者代碼。然后讓我們用Ctrl+F5或者點那個空心三角形運行一下吧: OK了,接下來你可以通過更改這個程序去練習(xí)C+教材上面的程序了。 這一章的內(nèi)容就是這么多了,下一章中我們將討論以下內(nèi)容:什么是C+?什么是編程等等。Visual C+ 2010入門教程系列三:關(guān)于C+的一些問題這一回我自己都不知道應(yīng)該寫點什么好,或許今天的篇幅會比往常短很多。我說過,這不是C+的教程,因為我還沒有那個能力來教大家C+,我能做的,是分享一些
20、學(xué)習(xí)的經(jīng)驗,以及教新手如何使用VC2010這個工具去練習(xí)和實踐其它C+教材上面的程序,如C+Primer等。 今天說的是我學(xué)習(xí)和使用C+這些年來對C+的一些理解,這樣的日志其實是最難寫的,因為眾口難調(diào),為什么這么說呢?同樣的一段音樂不同的人去傾聽都會有不同的感受,不同的心境去聽也會有不同的感覺。記得當(dāng)年我在聽雅尼的If I could tell you聽到的是無盡的傷感和無奈,而我的朋友卻怎么也聽不出來,呵,你去聽聽之后會有什么感覺? 好,回歸正題吧。 什么是編程 下面這段話我是從百度百科“編程”詞條復(fù)制過來的,不敢掠人之美: 編程就是讓計算機為解決某個問題而使用某種程序設(shè)計語言編寫程序代碼,
21、并最終得到結(jié)果的過程。為了使計算機能夠理解人的意圖,人類就必須要將需解決的問題的思路、方法、和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據(jù)人的指令一步一步去工作,完成某種特定的任務(wù)。這種人和計算機之間交流的過程就是編程。 這段話說的比較明白,我們?nèi)绻胱層嬎銠C按照我們想要的方式工作,那么我們必須給它命令,有的常見的任務(wù)已經(jīng)由操作系統(tǒng)幫助我們提供了,操作系統(tǒng)將一些簡單的指令封裝成一個簡單的操作,使得我們的操作更容易更簡單,然而操作系統(tǒng)提供的操作始終是有限的,如果要擴展計算機的軟件系統(tǒng),就需要編程了。 什么是編程語言 如上所說,編程語言就是人類與計算機交流的橋梁。首先編程語言必須是計
22、算機可以理解的或者是可以間接轉(zhuǎn)換成計算機可以理解的指令的東西。打個比方,如果你在一臺普通電腦面前站著,大叫道:“電腦,給哥把C盤根目錄下面的A文件拷貝到D盤根目錄下面去”。我猜想你就算叫上一天也沒用,因為普通的電腦無法識別你的指令,這就算是對“機”彈琴吧。 什么是編譯器 如上所說,編程語言是計算機可以直接理解的如機器碼或者可以間接轉(zhuǎn)換成計算機可以理解的指令的東西。那么C+就屬于后者,那么是什么把C+翻譯成計算機可以識別的指令的呢?這就是編譯器。 什么是C+ 我不想說C+的歷史了,我想說,它是一門編程語言,它可以通過編譯器的翻譯成為計算機可以識別的指令。比如我們常見的C+代碼: int a =
23、3 + 1; cout a endl; 這翻譯成機器碼或者計算機可以理解的指令大概可以是這樣的: 現(xiàn)在請為我準(zhǔn)備一個變量a,請用3+1的和去初始化它,然后請加它的值輸出到控制臺上并追加上一個空格。 關(guān)于C+的更多東西,建議大家去看專門的C+教材或者維基百科、百度百科等相關(guān)詞條。 學(xué)C+學(xué)的是什么? 學(xué)C+學(xué)的是什么?可以說C+是很復(fù)雜的,因為要實現(xiàn)一些在其它語言中很簡單的任務(wù),在C+中通常都需要更多的代碼和時間,以創(chuàng)建一個窗口為例,其它語言由于有內(nèi)置的支持,甚至當(dāng)我們創(chuàng)建一個HelloWorld程序時候就已經(jīng)創(chuàng)建了一個窗口。而在純粹的C+環(huán)境中,這是做不到的,因為C+并沒有提供GUI的內(nèi)置支持
24、,如果要用C+創(chuàng)建窗口,我們需要使用到系統(tǒng)API或者使用封裝了這些API的一些庫,前者如Win32程序設(shè)計后者如MFC、wxWidgets。 但是這些并不能代表C+不好,反而C+是很強大的,我們學(xué)習(xí)C+學(xué)得不僅僅是C+的語法,因為僅僅懂得C+的一些語法又能怎么樣呢?演示算法么?其實我認為學(xué)習(xí)C+的初期當(dāng)然是熟悉C+的語法,中期當(dāng)然是學(xué)習(xí)STL等庫、系統(tǒng)API以及熟悉C+的面向?qū)ο蟮乃枷牒鸵话愕脑O(shè)計方法;后期是伴隨著你C+生涯的一生的,因為它沒有終點的,這時候除了要繼續(xù)加深對C+的理解之外,還需要去學(xué)習(xí)各種各樣的基于C+的庫,因為你需要在這些庫的幫助下使用C+去實現(xiàn)更具體的東西,比如一些GUI庫
25、如QT、wxWidgets,一些游戲引擎如Ogre、Unreal、Bigworld等,一些網(wǎng)絡(luò)庫如ASIO、RakNet、ACE等。這些庫大多有一個特點就是他們是基于C+,封裝了底層的API使得我們可以不必每次多去使用繁雜的API來實現(xiàn)我們想要的功能。當(dāng)然,你也可以用C+去封裝這些API,讓自己成為一個庫作者,方便他人。 學(xué)習(xí)C+,學(xué)習(xí)C和C+的庫,學(xué)習(xí)其它各領(lǐng)域的C+庫,好好的使用這些庫或者自己寫一些庫,其它一些你能想到的與C+相關(guān)的事情。 怎樣才能用C+來做事情 通常我認為如果只使用最基本的C+以及其內(nèi)置庫來做事情,那么能做的事情始終是有局限的,因為C+的庫畢竟是有限的,我們能用它來寫一些
26、核心代碼,因為這部分代碼通常都不需要與具體的應(yīng)用關(guān)聯(lián)起來。使用C+以及C+繼承的C庫我們能做一些簡單的文件操作,因此還可以寫一些與此相關(guān)的處理程序。其實不僅僅是C+,比如C#,加入你在應(yīng)用中不引入.net Framework下面提供的大量的其它的類(指除了最基本的如System.Console等之外的類),你又能用C#做什么呢?我們在做C#的時候通常要引入一些新的類,引用一些新的命名空間,其實C+也是這樣的,要做更具體的事情,就需要除C+本身之外的更多東西才行。 因此,要用C+來做事情,除了C+的基本語法之外,還需要學(xué)習(xí)一些其它一些內(nèi)容如Windows API、MFC、DirectX 3D A
27、PI等。 C+、C#、Java到底誰好? 對于這個問題,我想說的是:語言無貴賤,技術(shù)有高低。其實無論什么語言,它們在這里都是編程語言,也許它們看起來不一樣,它們用起來也不一樣,它們的“翻譯”編譯器不一樣,但是它們的本質(zhì)作用就是要用它們自己的方式將我們?nèi)祟惖慕鉀Q問題的方法、思路和流程告知給計算機。這也就是為什么C+、C#、Java可以相互交互的原因。 每個語言就像江湖上的各門派的武功一樣,其實真的沒有高下之分,只有個人的修為,少林武功就一定強于武當(dāng)么?碧血劍中袁承志不也用普普通通的五行拳擊潰了榮彩么?只是不同的武功在不同的條件下表現(xiàn)不同,他們各自占據(jù)了自己有利的地位罷了,以楊家槍法為例,或許二人
28、比武它不厲害,但是征戰(zhàn)沙場估計是再適合不過了。 因此不要再糾結(jié)什么語言好,什么語言流行了,選擇一個自己喜歡的方向,然后調(diào)查好那個方向最常用最適合的語言,然后集中注意力堅持的去學(xué)習(xí)它,這就好了。 今天的內(nèi)容就是這些,希望對大家有幫助。請大家務(wù)必好好學(xué)習(xí)C+教材,并使用VC2010好好演練,最好能夠舉一反三自己創(chuàng)造問題自己解決!多看看百度知道C/C+下面的那些問題,每解決一個那樣的問題,你自己也會進步。Visual C+ 2010入門教程系列四:VC2010中初學(xué)者常見錯誤、警告和問題 這一章將幫助大家解釋一些常見的錯誤、警告和問題,幫助大家去理解和解決一些常見問題,并了解它的根本原因。 iost
29、ream.h與 下面的代碼為什么在VC2010下面編譯不過去?#include int main()coutHello World.endl;return 0; 錯誤信息:fatal error C1083: 無法打開包括文件:“iostream.h”: No such directory 造成這個錯誤的原因在于歷史原因,在過去C+98標(biāo)準(zhǔn)尚未訂立的時候,C+的標(biāo)準(zhǔn)輸入輸出流確實是定義在這個文件里面的,這是C風(fēng)格的定義方法,隨著C+98標(biāo)準(zhǔn)的確定,iostream.h已經(jīng)被取消,至少在VC2010下面是這樣的,取而代之的是我們要用頭文件來代替,你甚至可以認為是這樣定義的: namespace
30、std #include iostream.h 因此我們可以簡單的修改我們的Hello World。 #include using namespace std;int main()coutHello World.endl;return 0; iostream.h是屬于C+的頭文件,而非C的,因此標(biāo)準(zhǔn)訂立的時候被改成了。而C的頭文件stdio.h等依然可以繼續(xù)使用,這是為了兼容C代碼。但是它們依然有對應(yīng)的C+版本,如 等。記住,在VC2010上面采用C+風(fēng)格的頭文件而不是C風(fēng)格的頭文件,除非你是在用C。 warning C4996 這是一個警告,請看下面的代碼:#include using na
31、mespace std;int main()char sz128 = 0;strcpy( sz, Hello World! );cout sz endl;return 0; 上面的strcpy會產(chǎn)生這個警告: warning C4996: strcpy: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 這是因為VC從2005版本開始,
32、微軟引入了一系列的安全加強的函數(shù)來增強CRT(C運行時),這里對應(yīng)的是strcpy_s。_s意為safe的意思,同樣的道理,strcat也是同樣。因此要解決這個問題,我們可以用strcpy_s來替換strcpy,但是注意strcpy_s并非所有編譯器都提供,因此如果要跨編譯器,請采用錯誤信息中所提示的方式,定義_CRT_SECURE_NO_WARNINGS宏來掩耳盜鈴吧。另外注意并非所有的加強函數(shù)都是在屁股后面加_s,比如stricmp這個字符串比較函數(shù)的增強版名字是_stricmp。下面,用strcpy_s來更改程序:int main()char sz128 = 0;strcpy_s( sz
33、, Hello World! );cout sz endl;char* pSz2 = new char128;strcpy_s( pSz2, 128, hello);cout pSz2 endl;delete pSz2;return 0; 注意,strcpy_s有兩個版本,一個可以幫助我們自動推斷緩沖區(qū)的大小,而另外一個不能幫助我們推斷,因此在編譯器不能推斷緩沖區(qū)大小的時候,我們需要自己指定緩沖區(qū)的大小,如上面的程序所演示的那樣,關(guān)于增強版的函數(shù)請參考我寫的深入學(xué)習(xí)C+ String2.1版。 TCHAR、wchar_t、char 請大家看下面這個程序:#include #include #i
34、nclude using namespace std;int main()MessageBox( NULL, 你好HelloWorld!, Information, 0 );return 0; 貌似沒什么問題吧?錯了,如果你是按照我教你的方法創(chuàng)建的控制臺空工程的話,那么會有編譯錯誤: error C2664: “MessageBoxW”: 不能將參數(shù) 2 從“const char 17”轉(zhuǎn)換為“LPCWSTR” 這個問題太普遍了,幾乎所有的初學(xué)者都會遇到而且感到難以應(yīng)付,因為按照提示使用(LPCWSTR)強制轉(zhuǎn)型貌似并不能幫助我們解決問題,而且這個程序在VC6下面應(yīng)該是沒有任何問題的,那問題出
35、現(xiàn)在哪里呢?問題在這里,請右鍵單擊解決方案瀏覽器下面的項目,屬性, 問題的根本就是字符集問題,在VC6中,我們默認使用的是多字節(jié)字符集,而現(xiàn)在我們默認需要的是UNICODE字符集,簡單的,我們把這個字符集改成多字節(jié)字符集這個問題就解決了: 再試試應(yīng)該就可以了吧?但是我并不推薦大家這么做,因為讓自己的程序適應(yīng)各種字符集是我們寫代碼的人義不容辭的義務(wù)。 我們把程序改成下面這樣:#include #include #include using namespace std;int main()MessageBox( NULL, TEXT(你好HelloWorld!), TEXT(Information
36、), 0 );MessageBox( NULL, _T(你好HelloWorld!), _T(Information), 0 );return 0; 用兩個宏TEXT或者_T都可以解決這個問題,它們兩個并沒有太大區(qū)別,也許區(qū)別在于前者是通過windows.h頭文件引入的,而_T是通過tchar.h引入的,我推薦大家使用_T和tchar.h,因為tchar.h還幫助我們引入了其它一些很有用的宏,比如_tcscpy_s,這個宏在使用UNICODE字符集的時候被替換成wcscpy_s,在使用多字節(jié)字符集的使用被替換成strcpy_s。關(guān)于這部分的內(nèi)容,請大家不要錯過Windows核心編程的第二章(第
37、四版或第五版都可以),以及深入學(xué)習(xí)C+ String2.1版。 它們都有提到。 有人聽說_T可以把多字節(jié)字符串轉(zhuǎn)換成UNICODE,因此他寫了如下的代碼:const char* pStr = haha哈哈;MessageBox( NULL, _T(pStr), _T(Information), 0 ); 當(dāng)然,除非你運氣好的抓狂,否則你是編譯不過去的,為什么呢?我們現(xiàn)在應(yīng)該知道對于Hello這樣的字符串,VC2010會默認的將它視為const char*,即多字節(jié)字符串,而LHello前面有個L前綴的被視為UNICODE字符串,這和C#是有區(qū)別的,因為C#的字符串總是被視為UNICODE,C+
38、/CLI下面編譯器也會幫助我們做到這件事情,所以它們不需要L(C+/CLI兼容L這種寫法)。 讓我們看看_T的定義吧:#define wxCONCAT_HELPER(text, line) text # line/* could already be defined by tchar.h (its quasi standard) */#ifndef _T #if !wxUSE_UNICODE #define _T(x) x #else /* Unicode */ /* use wxCONCAT_HELPER so that x could be expanded if its a macro
39、*/ #define _T(x) wxCONCAT_HELPER(L, x) #endif /* ASCII/Unicode */#endif /* !defined(_T) */ _T在UNICODE下面最終會被替換成L # x。 #是一個編譯預(yù)處理指令,意味著讓L和x貼在一起,比如L # Hello最終就是LHello,因此它可以把Hello轉(zhuǎn)換成UNICODE字符串。那為什么上面的程序不行呢?讓我們看看_T(pStr)會被替換成什么:L # pStr - LpStr,哦,LpStr是一個新的標(biāo)識符,如果你沒有定義過它,你當(dāng)然不能通過編譯啦。 因此我們可以了解到_T這樣的宏只能處理直接的常
40、量字符串,不能處理其它的情況。而我們上面演示的那種情況需要我們動態(tài)的去轉(zhuǎn)換編碼,Windows有API可以幫助我們做到,C庫也有函數(shù)可以幫助我們。恰好我曾經(jīng)寫過這樣的代碼,歡迎大家參考:ASCII/UNICODE/UTF8字符串互相轉(zhuǎn)換的C+代碼 對于_T宏,再說一點東西,或許你會感到奇怪為什么_T不直接定義成#define _T(x) L # x,而要繞個圈子去調(diào)用wxCONCAT_HELPER呢?這實際上涉及到宏展開順序和截斷的問題。在這里,我們需要說一個宏參數(shù)的概念,這很函數(shù)的參數(shù)是類似的,這里_T(x)的x就是宏參數(shù),好,記住下面一句話: 如果你定義的宏中使用了#或者是#的話,宏參數(shù)將
41、不會被展開,也就是說_T(x)如果直接定義成L#x那么在下面這種情況就會出錯( PS: #是給參數(shù)加引號的意思): _T(_FUNCTION_),_FUNCTION_是一個預(yù)定義的宏,它代表了當(dāng)前函數(shù)的名字,這個展開會是什么呢?L_FUNCTION_。為什么間接調(diào)用wxCONCAT_HELPER就能得到正確的結(jié)果呢?因為當(dāng)我們調(diào)用wxCONCAT_HELPER的時候,_FUNCTION_已經(jīng)被_T展開成了函數(shù)名。 說多了說多了,如果你覺得復(fù)雜可以暫時跳過這些東西,我只是順便說說。 重定義的編譯錯誤和鏈接錯誤 讓我們在項目里面再添加一個Test.h頭文件,方法是右擊解決方案中的項目,添加,新建項
42、,C+頭文件,名稱輸入test.h。然后我們在test.h中輸入:/*#pragma once*/void print() 回到main.cpp中:#include using namespace std;#include Test.h#include Test.hint main()return 0; 編譯一下我們會得到重定義的編譯錯誤: error C2084: 函數(shù)“void print(void)”已有主體 或許你會說,你引用(#include)了兩次,我沒你那么傻,我只引用一次不就好了么?是的。你聰明,但是是小聰明哈,因為你不能保證每個人都不去引用它。 這個問題演示的是#pragma
43、 once的用處,讓我們解開它的注釋。編譯成功!#pragma once的作用就在于防止頭文件被多次引用。你或許見過#ifndef _TEST_H_#define_TEST_H_代碼#endif 這樣的代碼,它們的作用是一樣的,如果你跟我一樣懶,那么就用#pragma once,如果你打算去沒有這個指令的編譯器上編譯代碼,那么還是用后面一種方式吧。 現(xiàn)在讓我們來見識一個對初學(xué)者稍微復(fù)雜一點的鏈接錯誤,用創(chuàng)建main.cpp的方法再添加一個test.h頭文件,輸入#include Test.h即可。 讓我們再編譯一次。1test.obj : error LNK2005: void _cdecl
44、print(void) (?printYAXXZ) 已經(jīng)在 Main.obj 中定義1e:documentsvisual studio 2010ProjectsHelloWorldDebugHelloWorld.exe : fatal error LNK1169: 找到一個或多個多重定義的符號 如果說編譯錯誤好找的話,鏈接錯誤對于初學(xué)者來說就有點麻煩了,聰明的初學(xué)者會去Google、百度尋找答案,笨的初學(xué)者就會找所謂的高手、前輩問,而這些高手Or前輩未必有心情為你解釋。要解決這個錯誤有無數(shù)種方法。 1.內(nèi)聯(lián),把print聲明為內(nèi)聯(lián)函數(shù)。 inline void print() 這個方法的好處是
45、簡單,壞處是局限性太強,意味著你總是需要公開print的實現(xiàn),因為內(nèi)聯(lián)函數(shù)必須在編譯時就知道實現(xiàn)才行。 2.static,把print聲明為static函數(shù): static void print()。 這便告訴編譯器,哥是唯一的,而且哥只能被本編譯單元的代碼調(diào)用,這和extern是對應(yīng)的。簡單來說,想要哥幫你做事,請先include哥聲明的頭文件,也就是#include test.h。 3.h頭文件中只放聲明,實現(xiàn)放到.cpp中去。 現(xiàn)在test.h中只有void print();,而實現(xiàn)在test.cpp中: #include Test.h void print() int a = 1; c
46、out a+ endl; 這個時候有意思的是我們在main.cpp無需包含test.h頭文件也可以引用print函數(shù),因為print并非static的函數(shù):void print();int main()print();print();return 0; 但是聲明一下是必須的。Visual C+ 2010新功能之static_assert(靜態(tài)斷言) 寫過模板的同學(xué)對下面的這樣的代碼應(yīng)該會很熟悉:template class static_arrayprivate: typedef DBSOFT_TR1:array array_type; typedef char _TEMPLATE_CHECK
47、_DUMMY_sizeof(T); / 如果sizeof無法計算T的大小會報錯 typedef char _TEMPLATE_CHECK_LEN_DUMMY_MaxLen-1; / 不能用負數(shù)、0等來具現(xiàn)化 在編譯時它會在我們使用void或者長度小于等于0去具現(xiàn)化這個模板類的時候提示編譯錯誤。以上面的代碼為例,如果我們這樣去使用這個static_array的話:#include int main()dbsoft:static_array aryTest;return 0; 會遇到這樣的錯誤:1d:dbsoftdbsoftgenericstatic_array.hpp(34): error C2
48、070: “void”: 非法的 sizeof 操作數(shù)1 e:documentsvisual studio 2010projectshelloworldhelloworldmain.cpp(9): 參見對正在編譯的類 模板 實例化“dbsoft:static_array”的引用1 with1 1 T=void,1 MaxLen=101 通過這個提示我們就可以知道我們使用錯了,將問題提前暴露出來總是好的,省去了大量的運行時Debug的麻煩。雖然這種方法可以幫助我們做編譯時鑒定,但是它的信息始終不是友好的,從VC2010開始,一個新的斷言可以幫我們發(fā)揮出這種鑒定方式的最大威力,它就是static_
49、assert。 它的聲明是這樣的: static_assert( 編譯時可推斷出結(jié)果的表達式, 一個簡單的多字節(jié)的字符串 ) 前者必須是一個編譯時可知的表達式或者數(shù)值,如果你用一個變量去作為它的第一個參數(shù)是會遇到編譯錯誤的,要斷言變量可以用assert而非這個靜態(tài)斷言。 遺憾的是static_assert只能支持簡單的字符串,即使你在這個字符串中嵌入中文,它也顯示不出來。 熟悉Boost的同學(xué)都知道Boost也有一個靜態(tài)斷言的庫位于boost/static_assert.hpp,不過可惜的是它確實無法和VC2010這個內(nèi)置的靜態(tài)斷言相比,因為它確實無法嵌入像靜態(tài)斷言那樣嵌入更多有用的信息,因為這畢竟需要編譯器的內(nèi)置支持才可以。#ifdef BOOST_HAS_STATIC_ASSERT# define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)#else 當(dāng)編譯器支持靜態(tài)斷言的時候,Boost的靜態(tài)斷言會被自動替換成編譯器的靜態(tài)斷言,但是可惜的是它只是簡單的將表達式靜態(tài)的轉(zhuǎn)換成字符串用于友好信息,這不能不說是一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報參考:金銀繡藝術(shù)特征及其傳承創(chuàng)新研究
- 二零二五版能源設(shè)施安全防護勞務(wù)分包協(xié)議3篇
- 二零二五版房地產(chǎn)開發(fā)經(jīng)營項目環(huán)境保護合同范本3篇
- 2025年常州貨運資格證在哪里練題
- 二零二五版毛竹砍伐與林業(yè)碳交易市場接入合同4篇
- 2025年光伏發(fā)電項目投資合作合同模板4篇
- 二零二五年度出租車公司車輛融資租賃合同5篇
- 二零二五年度農(nóng)產(chǎn)品電商平臺合作協(xié)議6篇
- 2025年度智能倉儲物流系統(tǒng)承包經(jīng)營協(xié)議書4篇
- 二零二五年度企業(yè)信用擔(dān)保合同模板:降低融資風(fēng)險2篇
- 課題申報書:GenAI賦能新質(zhì)人才培養(yǎng)的生成式學(xué)習(xí)設(shè)計研究
- 駱駝祥子-(一)-劇本
- 全國醫(yī)院數(shù)量統(tǒng)計
- 《中國香文化》課件
- 2024年醫(yī)美行業(yè)社媒平臺人群趨勢洞察報告-醫(yī)美行業(yè)觀察星秀傳媒
- 第六次全國幽門螺桿菌感染處理共識報告-
- 天津市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 經(jīng)濟學(xué)的思維方式(第13版)
- 盤錦市重點中學(xué)2024年中考英語全真模擬試卷含答案
- 手衛(wèi)生依從性調(diào)查表
- 湖北教育出版社四年級下冊信息技術(shù)教案
評論
0/150
提交評論