C常見編譯鏈接錯誤即解決方法概要_第1頁
C常見編譯鏈接錯誤即解決方法概要_第2頁
C常見編譯鏈接錯誤即解決方法概要_第3頁
C常見編譯鏈接錯誤即解決方法概要_第4頁
C常見編譯鏈接錯誤即解決方法概要_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

C++課程上機(jī)實(shí)驗(yàn)常有錯誤齊集1.在源碼中丟掉“;”調(diào)試器錯誤信息:syntaxerror:missing';'2.缺少命名空間使用定義:即缺少“usingnamespacestd;”調(diào)試器錯誤信息:例:errorC2065:'cout':undeclaredidentifier比方cout/cin/endl/<</>>等在命名空間中定義的符號和標(biāo)示符無法使用。3.變量不決義就直接使用調(diào)試器錯誤信息:例:errorC2065:'i':undeclaredidentifierC++語言中,變量的使用必需依照先聲明定義,后使用的原則。4.在程序中使用中文標(biāo)示符,如將英文”;”錯誤輸入成了”;”調(diào)試器錯誤信息:errorC2018:unknowncharacter'0xa3'在C++中,除程序說明能夠采用中文外,其他字符要求使用英文。很多同學(xué)在建立工程或程序名稱時(shí)也使用中文名稱,建議改掉這種習(xí)慣。5.在使用輸入輸出流的時(shí)候錯誤使用了標(biāo)示符“>>”“<<”,例cout>>a;調(diào)試器錯誤信息:例:errorC2676:binary'>>':'classstd::basic_ostream<char,structstd::char_traits<char>>'doesnotdefinethisoperatororaconversiontoatypeacceptabletothepredefinedoperator關(guān)于流操作的方向搞錯是一個(gè)寬泛錯誤,問題原來其實(shí)不復(fù)雜,可能是由于沒有認(rèn)真看書的原因。6.定義的變量種類與使用不對應(yīng),如聲明為float,但實(shí)質(zhì)給與了一個(gè)double的值,例:調(diào)試器錯誤信息:warningC4305:'initializing':truncationfrom'constdouble'to'float'7.變量在賦值從前就使用,例:inta,b,c;c=a+b;cin>>a>>b;調(diào)試器錯誤信息:warningC4700:localvariable'a'usedwithouthavingbeeninitialized出現(xiàn)這種錯誤主若是對面向過程的程序執(zhí)行沒有理解。8.在一個(gè)工程中包含多于一個(gè)的main函數(shù)errorC2556:'int__cdeclmain(void)':overloadedfunctiondiffersonlybyreturntypefrom'void__cdeclmain(void)'E:\temp\alskdf\ldid.cpp(4):seedeclarationof'main'E:\temp\alskdf\ldid.cpp(15):errorC2371:'main':redefinition;differentbasictypes在上機(jī)課中向來有同學(xué)犯這種錯誤,原因可能是向來沒有上過機(jī)。9.在函數(shù)定義的()后邊使用分號例:voidchang( );{}調(diào)試器錯誤信息:errorC2447:missingfunctionheader(old-styleformallist?)10.函數(shù)聲明/定義/調(diào)用參數(shù)個(gè)數(shù)不般配.例:voidchang(inta,intb,floatc){}voidmain( ){chang(3,4);}調(diào)試器錯誤信息:errorC2660:'chang':functiondoesnottake2parameters最常有的20種VC++編譯錯誤信息1、atalerrorC1010:unexpectedendoffilewhilelookingforprecompiledheaderdirective。搜尋預(yù)編譯頭文件路徑時(shí)遇到了不應(yīng)遇到的文件尾。(一般是沒有#include"stdafx.h")2、fatalerrorC1083:Cannotopenincludefile:'R.h':Nosuchfileordirectory不能夠打開包含文件“R.h”:沒有這樣的文件或目錄。3、errorC2011:'C':'class'typeredefinition類“C”重定義。4、errorC2018:unknowncharacter'0xa3'不認(rèn)識的字符'0xa3'。(一般是漢字或中文標(biāo)點(diǎn)符號)5、errorC2057:expectedconstantexpression希望是常量表達(dá)式。(一般出現(xiàn)在switch語句的case分支中)6、errorC2065:'IDD_MYDIALOG':undeclaredidentifier“IDD_MYDIALOG”:未聲明過的表記符。7、errorC2082:redefinitionofformalparameter'bReset'函數(shù)參數(shù)“bReset”在函數(shù)體中重定義。8、errorC2143:syntaxerror:missing':'before'{'句法錯誤:“{”前缺少“;”。9、errorC2146:syntaxerror:missing';'beforeidentifier'dc'句法錯誤:在“dc”前丟了“;”。10、errorC2196:casevalue'69'alreadyused值69已經(jīng)用過。(一般出現(xiàn)在switch語句的case分支中)11、errorC2509:'OnTimer':memberfunctionnotdeclaredin'CHelloView'成員函數(shù)“OnTimer”沒有在“CHelloView”中聲明。12、errorC2511:'reset':overloadedmemberfunction'void(int)'notfoundin'B'重載的函數(shù)“voidreset(int)”在類“B”中找不到。13、errorC2555:'B::f1':overridingvirtualfunctiondiffersfrom'A::f1'onlybyreturntypeorcallingconvention類B對類A中同名函數(shù)f1的重載僅依照返回值或調(diào)用約定上的差異。14、errorC2660:'SetTimer':functiondoesnottake2parameters“SetTimer”函數(shù)不傳達(dá)2個(gè)參數(shù)。15、warningC4035:'f':noreturnvalue“f”的return語句沒有返回值。16、warningC4553:'==':operatorhasnoeffect;didyouintend'='?沒有收效的運(yùn)算符“==”;可否改為“=”?17、warningC4700:localvariable'bReset'usedwithouthavingbeeninitialized局部變量“bReset”沒有初始化就使用。18、errorC4716:'CMyApp::InitInstance':mustreturnavalue“CMyApp::InitInstance”函數(shù)必定返回一個(gè)值。19、LINK:fatalerrorLNK1168:cannotopenDebug/P1.exeforwriting連接錯誤:不能夠打開P1.exe文件,以改寫內(nèi)容。(一般是P1.Exe還在運(yùn)行,未關(guān)閉)20、errorLNK2001:unresolvedexternalsymbol"public:virtual__thiscallC::~C(void)"連接時(shí)發(fā)現(xiàn)沒有實(shí)現(xiàn)的外面符號(變量、函數(shù)等)。VC++6.0使用步驟以下新建工程—增加文件—編譯—鏈接---運(yùn)行創(chuàng)辦工程、文件并輸入源程序代碼(1)新建Win32ConsoleApplication工程選擇file->new選擇Projects->Win32ConsoleApplication標(biāo)簽ps:在location地址可選擇工程的創(chuàng)辦地址。選擇Anemptyproject此后選擇finish彈出如圖,單擊OK即可ps:點(diǎn)擊左邊的工程信息右下角的“FileView”選項(xiàng);能夠看到你新建的工程,再雙擊你新建的工程名能夠查察工程的信息。其中,SourceFiles為包含所有工程的源文件,HeaderFiles為包含所有工程的頭文件。在工程中新建C源程前言件并輸入源程序代碼增加源碼到add工程ps:建立源文件,選擇“C++Source”,簡單的程序都是建立這種文件的(在單文件工程中使用),從而產(chǎn)生.cpp文件。若是要建立頭文件的話,選擇“C/C++HeaderFile”(在多文件工程中使用),可產(chǎn)生.h文件。此后增加文件名稱。認(rèn)識:文件擴(kuò)大名是.h的文件代表的是頭文件,一般是書寫一些函數(shù)原型,以及一些在整個(gè)程序中常用到的構(gòu)造體,頻頻使用的函數(shù)說明,定義等等;文件擴(kuò)大名為.cpp的文件代表的是源文件,也是最常用到的文件,每建立一個(gè)工程都要最少一個(gè)源文件(最少要有一個(gè)函數(shù)入口——主函數(shù)main( )),包含了核心代碼。此時(shí),相關(guān)工程和文件已經(jīng)創(chuàng)辦達(dá)成,能夠進(jìn)行輸入源碼并編譯鏈接運(yùn)行。(3)輸入源程序代碼源程序代碼以下:編譯、鏈接及運(yùn)行運(yùn)行結(jié)果以下所示:ps:誠然有快速的直接敲源碼,此后編譯時(shí)再保留,但是編寫程序最好依照工程流程操作。若是是您有代碼如:cpp文件,或.h文件,想增加都VC6.0里來測試的話,能夠這樣做:1)按上面步驟建立一個(gè)簡單的工程2)在源文件選項(xiàng)“SourceFiles”,右鍵單擊中的“增加目錄到工程”,增加你要打開的擴(kuò)展名為.cpp的源文件。在頭文件選項(xiàng)“HeaderFiles”,右鍵單擊中的“增加目錄到工程”,增加你要打開的擴(kuò)展名為.h的頭文件。增加完你所有的頭文件和源文件此后,檢查一下可否增加達(dá)成,此后就可以編譯了。對一個(gè)簡單程序的調(diào)試過程1.假設(shè)準(zhǔn)備編制進(jìn)行以下計(jì)算任務(wù)的一個(gè)簡單程序:在已知x=3、y=5的狀況下,先計(jì)算出x與y的和s,差d,商q,模r,此后計(jì)算res=s+2d+3q+4r的值(res應(yīng)該等于并顯示在屏幕上。但編制的以下程序運(yùn)行后卻得出了一個(gè)錯誤結(jié)果“res=26”。#include<stdio.h>voidmain( ){intx=3,y=5;ints,d,q,r,res;s=x+y;d=s-y;q=x/y;r=x%y;res=s+2*d+3*q+4*r;printf("res=%d\n",res);}復(fù)制代碼解析上述所編制的程序行,假設(shè)能在要輸出res結(jié)果值的那一程序行(倒數(shù)第二行)處設(shè)置一個(gè)臨時(shí)斷點(diǎn),讓程序先執(zhí)行到此斷點(diǎn)處(注意設(shè)為斷點(diǎn)的那一行還沒有被執(zhí)行!),看一看那時(shí)各變量的動向取值狀況,有可能就會找到出錯的原因!基于上述解析,先將鼠標(biāo)光標(biāo)搬動到“printf("res=%dn",res);”那一行處(左鍵單擊那一行任意地址),從而指定了臨時(shí)性斷點(diǎn)的行地址,此后執(zhí)行“Build→StartDebug→RuntoCursor”選項(xiàng),使程序運(yùn)行到所指定行時(shí)暫停其執(zhí)行,并顯示出如圖3-2的界面,其中的左下方窗口中就列出了當(dāng)時(shí)各變量的取值狀況:和s=8,差d=3(x=3,y=5,它們的差d=3必然是錯誤的!),商q=0,模r=3,最后結(jié)果res=26。再認(rèn)真查察程序中負(fù)責(zé)計(jì)算差d的那一個(gè)語句“d=s-y;”就會茅塞頓開,原來將“x-y”誤寫成了“s-y”!找到了錯誤,此時(shí)能夠經(jīng)過菜單項(xiàng)選擇項(xiàng)“Debug→StopDebugging”,中斷當(dāng)前的調(diào)試過程并返回正常的編寫狀態(tài),更正所發(fā)現(xiàn)的錯誤后,再一次執(zhí)行將能得出正確結(jié)果“res=16”。順便指出,圖3-2中顯示的變量是“自動查察”方式的,即VC6自動顯示當(dāng)前運(yùn)行上下文中的變量的值。若是變量比很多,自動顯示的窗口比較凌亂,則能夠在Watch列表中增加自己想要監(jiān)控的變量名。上述設(shè)置臨時(shí)斷點(diǎn)(到鼠標(biāo)光標(biāo)那一行處)的調(diào)試手段使用起來很方便,會經(jīng)常使用(也經(jīng)常在到達(dá)一個(gè)斷點(diǎn)后,又設(shè)置另一個(gè)新的臨時(shí)斷點(diǎn))。別的也常配合使用“單步執(zhí)行”的方式,來認(rèn)真檢查每一步(一個(gè)程序行)執(zhí)行后各變量取值的動向變化情況,如,先經(jīng)過“RuntoCursor”執(zhí)行到某一個(gè)鼠標(biāo)光標(biāo)臨時(shí)斷點(diǎn)行處,此后經(jīng)過使用Debug菜單的“StepOver”或“StepInto”來進(jìn)行所謂的“單步執(zhí)行”,自然,每執(zhí)行一步后,都要認(rèn)真觀察并解析系統(tǒng)自動給出的各變量取值的動向變化狀況,以便及時(shí)發(fā)現(xiàn)異常而找到出錯原因。怎樣對C語言設(shè)計(jì)合適的程序調(diào)試方案讓我們來解析并設(shè)計(jì)對以下程序進(jìn)行調(diào)試的詳盡方法與手段(實(shí)質(zhì)上,對不同樣的程序,都需要在解析其執(zhí)行結(jié)果以及其程序編寫構(gòu)造的基礎(chǔ)上,來設(shè)計(jì)相應(yīng)的對其進(jìn)行具體調(diào)試的方法與手段,要旨是想方想法漸漸減小“偵探”范圍,直到最后找到出錯位置)。該程序除main外,還有一個(gè)自定義函數(shù)f。若已經(jīng)能確認(rèn)調(diào)用f函數(shù)前計(jì)算出的res值(或s、d、q或r其中之一的結(jié)果值)不正確的話,則可像上一程序那樣,在計(jì)算出res變量值的下一行(或在靠前一些的某一行)處設(shè)置斷點(diǎn),看到達(dá)那一斷點(diǎn)處可否一切正常。若到達(dá)斷點(diǎn)處的數(shù)據(jù)結(jié)果已經(jīng)不正常的話,錯誤已經(jīng)出現(xiàn)(出現(xiàn)在跟前或出現(xiàn)在前面,從而找到了錯誤也許減小了“偵探”范圍);若斷點(diǎn)處依舊正常,可斷言錯誤出現(xiàn)在后邊,此后,①可又一次經(jīng)過鼠標(biāo)光標(biāo)往更靠后一些的合適地址設(shè)置新斷點(diǎn),再一次“Debug→RuntoCursor”(一下向后“邁”過了好多行,再連續(xù)“偵探”!);②經(jīng)過“單步執(zhí)行”(Debug→StepOver),在重點(diǎn)思疑的那一塊地方認(rèn)真地逐行進(jìn)行“偵探”。注意,“StepOver不”會“追蹤”進(jìn)入f函數(shù)內(nèi)部,若思疑過使用“Debug→StepInto”進(jìn)入f內(nèi)部再進(jìn)行認(rèn)真調(diào)試“StepOver與“”StepInto的功”能是同樣的。若經(jīng)過“

函數(shù)可能有問題的話,要通(在不遇到函數(shù)調(diào)用的地方,StepInto進(jìn)入”到函數(shù)內(nèi)部,單步執(zhí)行若干步此后,若發(fā)現(xiàn)不再需要進(jìn)行單步伐試的話,部返回到調(diào)用語句的下一語句處)。

可經(jīng)過“StepOut從”函數(shù)內(nèi)其他設(shè)置固定性斷點(diǎn)最簡單的方法是:在某一程序行處,單擊鼠標(biāo)右鍵,在菜單中選擇“Insert/RemoveBreakpoint項(xiàng)”(經(jīng)過左鍵單擊該選項(xiàng),此時(shí)該行前將出現(xiàn)一個(gè)圓形的黑點(diǎn)標(biāo)志,意味著已經(jīng)將該行設(shè)置成了固定斷點(diǎn))。除去固定性斷點(diǎn)的方法為:在擁有圓形黑點(diǎn)標(biāo)志的固定斷點(diǎn)行處,單擊鼠標(biāo)右鍵,在菜單中選擇“RemoveBreakpoint”項(xiàng)(經(jīng)過左鍵單擊該選項(xiàng),此時(shí)該行前的那一個(gè)圓形黑點(diǎn)標(biāo)志將消失,意味著已經(jīng)除去了該固定斷點(diǎn))。設(shè)置了固定性斷點(diǎn)后,平常經(jīng)過“Build→StartDebug→Go”或“Debug→Go”選項(xiàng)使程序開始執(zhí)行,直到遇到某斷點(diǎn)或遇到程序結(jié)束而停止。還要說明的是,能夠隨時(shí)設(shè)置任意多個(gè)固定性斷點(diǎn),也能夠隨時(shí)除去它們。經(jīng)過使用菜單項(xiàng)選擇項(xiàng)“Edit→Breakpoints”,會出現(xiàn)一個(gè)對話框,在其中的“Breakat文”本框中鍵入要設(shè)置斷點(diǎn)的程序行的行數(shù)信息(但平常是先經(jīng)過鼠標(biāo)光標(biāo)選定某一程序行,再利用菜單項(xiàng)選擇項(xiàng)進(jìn)入上述對話框,此后經(jīng)過點(diǎn)擊“Breakat文”本框右邊的小三角按鈕,并選定系統(tǒng)自動供應(yīng)的程序行的行數(shù),省得自己要真切地去數(shù)清楚那一行的行數(shù)),也能夠在指定行處設(shè)置一個(gè)固定性斷點(diǎn)(經(jīng)過OK按鈕確定);若是要除去某斷點(diǎn),可在“Breakpoints列”表欄中先選定它,此后單擊Remove按鈕。實(shí)質(zhì)上,除地址斷點(diǎn)外,經(jīng)過“Edit→Breakpoints”,還可以夠設(shè)置數(shù)據(jù)斷點(diǎn),信息斷點(diǎn),以及條件斷點(diǎn)等,這兒就不再細(xì)說了。優(yōu)秀C程序員的基本素質(zhì)——豐富的想象、慎重的思想程序運(yùn)行結(jié)果看起來對了,但其實(shí)不意味著程序沒有隱蔽的問題①以下程序是從鍵盤輸入一個(gè)數(shù)(x,x是一個(gè)int型整數(shù)),計(jì)算y(y=1000x+9)并在屏幕上輸出,程序基本上是對的,能輸出正確的結(jié)果。#include<stdio.h>voidmain( ){intx,y;printf("Pleaseinputx:");scanf("%d",&x);y=1000*x+9;printf("y=%d\n",y);}但是,當(dāng)x輸入為5000000,屏幕上卻輸出y=705032713,出現(xiàn)了錯誤。23.復(fù)制代碼②以下程序的功能是從鍵盤上讀入一串字符,此后在屏幕上輸出。#include<stdio.h>voidmain( ){charstr[10];printf("Pleaseinputstr:");scanf("%s",&str);printf("str=%s\n",str);}復(fù)制代碼若用戶在輸入str時(shí)不小心多按了(或沒心碰觸)幾下鍵盤,則程序運(yùn)行會出錯,如圖3-3所示——可能稍嚴(yán)重的是程序運(yùn)行死機(jī)(不報(bào)錯),特別嚴(yán)重的是若有人精心設(shè)計(jì)輸入的字符,完滿可能造成系統(tǒng)被入侵或被嚴(yán)重?fù)p壞。③以下程序的功能是從計(jì)算班中男生(boy)和女生(girl)的比率。若是女生數(shù)為0時(shí),程序會怎樣?#include<stdio.h>voidmain( ){intboy,girl;printf("Pleaseinputboy,girl:");scanf("%d,%d",&boy,&girl);printf("boy/girl=%.2f\n",boy*1.0/girl);}復(fù)制代碼實(shí)質(zhì)工作中,近似的隱蔽的問題經(jīng)常是損壞力巨大的“地雷”,經(jīng)常造成極大的損失,比方火箭發(fā)射、宇宙飛船翱翔、高速列車運(yùn)行中的事故,我們平常接觸最多的生怕是微軟的各種系統(tǒng)需要不斷地打補(bǔ)丁。因此,在程序設(shè)計(jì)中,必定周祥考慮各種狀況,哪怕是機(jī)率極小的不測。(2)慎重思想的典范——程序員學(xué)習(xí)的模范豐富的想象力、慎重的思想是一個(gè)優(yōu)秀的程序應(yīng)該具備的素質(zhì)。泥于固定的思想方式,遇到問題的時(shí)候要多想幾種解決問題的方案,

設(shè)計(jì)程序時(shí)不要拘而且考慮全面、思想慎重。以下2個(gè)小故事,應(yīng)該是一個(gè)優(yōu)秀程序員的標(biāo)準(zhǔn)思想,它形象、幽默、充分地顯現(xiàn)了一個(gè)優(yōu)秀程序員的慎重、全面的思想。一個(gè)優(yōu)秀的程序員只有這樣思慮并設(shè)計(jì)程序,才能保證程序向來能可靠、牢固地工作,減少和防范發(fā)惹禍故。①方程可是關(guān)于正實(shí)數(shù)的簡單狀況建立物理教授走過校園,遇到數(shù)學(xué)教授。物理教授在進(jìn)行一項(xiàng)實(shí)驗(yàn),他總結(jié)出一個(gè)經(jīng)驗(yàn)方程,憂如與實(shí)驗(yàn)數(shù)據(jù)切合,他請數(shù)學(xué)教授看一看這個(gè)方程。一周后他們碰頭,數(shù)學(xué)教授說這個(gè)方程不能立??赡菚r(shí)物理教授已經(jīng)用他的方程預(yù)知出進(jìn)一步的實(shí)驗(yàn)結(jié)果,而且收效頗佳,因此他請數(shù)學(xué)教授再審查一下這個(gè)方程。又是一周過去,他們再次碰頭。數(shù)學(xué)教授告訴物理教授說這個(gè)方程確實(shí)建立,"但可是關(guān)于正實(shí)數(shù)的簡單狀況建立。"②判斷開槍后樹上還有幾個(gè)鳥某日,老師在課堂上想看看一學(xué)生智商有沒有問題,問他“樹上有十只鳥,開槍打死一只,還剩幾個(gè)?”他反問“是無聲手槍或其他無聲的槍嗎?”(比方激光槍)“不是?!薄皹屄曈卸啻??”“80-100分貝?!薄澳蔷褪钦f會震的耳朵疼?”“是。”“在這個(gè)城市里打鳥犯不犯法?”“不犯。”“您確定那只鳥真的被打死啦?”“確定?!迸家呀?jīng)不耐煩了“拜托,你告訴我還剩幾個(gè)就行了,OK”“OK,樹上的鳥里有沒有聾子?”“沒有?!薄坝袥]相關(guān)在籠子里的?”“沒有。”“邊上還有沒有其他的樹,樹上還有沒有其他鳥?”“沒有?!薄坝袥]有殘疾的或餓的飛不動的鳥?”“沒有?!薄八悴凰銘言卸亲永锏男▲B?”“不算?!薄按蝤B的人眼有沒有花?保證是十只?”“沒有花,就十只。”偶已經(jīng)滿腦門是汗,且下課鈴響,但他連續(xù)問“有沒有傻的不怕死的?”“都怕死。”“會不會一槍打死兩只?”“不會?!薄八械镍B都能夠自由活動嗎?”“完滿能夠。”“若是您的回答沒有騙人,”學(xué)生滿懷信心的說,“打死的鳥若是掛在樹上沒掉下來,那么就剩一只,若是掉下來,就一只不剩。”老師立刻暈倒。常有編譯錯誤提示(1)errorC2001:newlineinconstant編號:C2001直譯:在常量中出現(xiàn)了換行。錯誤解析:①字符串常量、字符常量中可否有換行。②在這句語句中,某個(gè)字符串常量的尾部可否遺漏了雙引號。42.③在這語句中,某個(gè)字符創(chuàng)常量中可否出現(xiàn)了雙引號字符“,"”但是沒有使用轉(zhuǎn)義符“"”。④在這句語句中,某個(gè)字符常量的尾部可否遺漏了單引號。⑤可否在某句語句的尾部,或語句的中間誤輸入了一個(gè)單引號或雙引號。(2)errorC2015:toomanycharactersinconstant編號:C2015直譯:字符常量中的字符太多了。錯誤解析:單引號表示字符型常量。一般的,單引號中必定有且只能有一個(gè)字符(使用轉(zhuǎn)義符時(shí),轉(zhuǎn)義符所表示的字符看作一個(gè)字符對待),若是單引號中的字符數(shù)多于4個(gè),就會惹起這個(gè)錯誤。別的,若是語句中某個(gè)字符常量缺少右邊的單引號,也會惹起這個(gè)錯誤,比方:if(x=='x||x=='y'){

}值得注意的是,若是單引號中的字符數(shù)是2-4個(gè),編譯不報(bào)錯,輸出結(jié)果是這幾個(gè)字母的ASC碼作為一個(gè)整數(shù)(int,4B)整體對待的數(shù)字。(3)errorC2137:emptycharacterconstant編號:C2137直譯:空的字符定義。錯誤解析:原因是連用了兩個(gè)單引號,而中間沒有任何字符,這是不同樣意的。(4)errorC2018:unknowncharacter'0x##'編號:C2018直譯:未知字符‘0x##’。錯誤解析:0x##是字符ASC碼的16進(jìn)制表示法。這里說的未知字符,平常是指全角符號、字母、數(shù)字,也許直接輸入了漢字。若是全角字符和漢字用雙引號包含起來,則成為字符串常量的一部分,是不會惹起這個(gè)錯誤的。(5)errorC2041:illegaldigit'#'forbase'8'編號:C2141直譯:在八進(jìn)制中出現(xiàn)了非法的數(shù)字‘#’(這個(gè)數(shù)字#平常是8也許9)。錯誤解析:若是某個(gè)數(shù)字常量以“0開”頭(單純的數(shù)字0除外),那么編譯器會認(rèn)為這是一個(gè)8進(jìn)制數(shù)字。比方:“089”、“078”、“093”是非法的,而都“071”是合法的,等同于是進(jìn)制中的“57”。(6)errorC2065:'xxxx':undeclaredidentifier編號:C2065直譯:表記符“xxxx未”定義。錯誤解析:第一,講解一下什么是表記符。標(biāo)志符是程序中出現(xiàn)的除重點(diǎn)字之外的詞,平常由字母、數(shù)字和下劃線組成,不能夠以數(shù)字開頭,不能夠與重點(diǎn)字重復(fù),而且區(qū)分大小寫。變量名、函數(shù)名、類名、常量名等等,都是標(biāo)志符。所有的標(biāo)志符都必定先定義,后使用。標(biāo)志符有好多種用途,因此錯誤也有好多種原因。若是“xxxx是”一個(gè)變量名,那么平常是程序員忘記了定義這個(gè)變量,也許拼寫錯誤、大小寫錯誤所惹起的,因此,第一檢查變量名可否正確。(關(guān)系:變量,變量定義)若是“xxxx是”一個(gè)函數(shù)名,那就思疑函數(shù)名可否沒有定義??赡苁瞧磳戝e誤或大小寫錯誤,自然,也有可能是你所調(diào)用的函數(shù)根本不存在。還有一種可能,你寫的函數(shù)在你調(diào)用所在的函數(shù)此后,而你有沒有在調(diào)用從前對函數(shù)原形進(jìn)行聲明。(關(guān)系:函數(shù)聲明與定義,函數(shù)原型)47.若是“xxxx是”一個(gè)庫函數(shù)的函數(shù)名,比方“sqrt、“”fabs,那”么看看你在cpp文件已開始可否包含了這些庫函數(shù)所在的頭文件(.h文件)。比方,使用“sqrt函數(shù)需要頭文件math.h。若是“xxxx就”是“cin或”“cout,”那么一般是沒有包含“iostream.h?!?關(guān)系:#include,cin,cout)

”若是“xxxx是”一個(gè)類名,那么表示這個(gè)類沒有定義,可能性依舊是:根本沒有定義這個(gè)類,也許拼寫錯誤,也許大小寫錯誤,也許缺少頭文件,也許類的使用在聲明從前。(關(guān)系:類,類定義)標(biāo)志符依照先聲明后使用原則。因此,無論是變量、函數(shù)名、類名,都必定先定義,后使用。如使用在前,聲明在后,就會惹起這個(gè)錯誤。C++的作用域也會成為惹起這個(gè)錯誤的騙局。在花括號之內(nèi)變量,是不能夠在這個(gè)花括號之外使用的。類、函數(shù)、if、do(while)、for所惹起的花括號都依照這個(gè)規(guī)則。(關(guān)系:作用域)前面某句語句的錯誤也可能以致編譯器誤認(rèn)為這一句有錯。若是你前面的變量定義語句有錯誤,編譯器在后邊的編譯中會認(rèn)為該變量向來沒有定義過,以致后邊所有使用這個(gè)變量的語句都報(bào)這個(gè)錯誤。若是函數(shù)聲明語句有錯誤,那么將會惹起同樣的問題。52.(7)errorC2086:'xxxx':redefinition編號:C2374直譯:“xxxx重”復(fù)聲明。錯誤解析:變量“xxxx”同一作用域中定義了多次。檢查在“xxxx的”每一次定義,只保留一個(gè),也許更正變量名。(8)errorC2374:'xxxx':redefinition;multipleinitialization編號:C2374直譯:“xxxx重”復(fù)聲明,多次初始化。錯誤解析:變量“xxxx在”同一作用域中定義了多次,而且進(jìn)行了多次初始化。檢查“xxxx的”每一次定義,只保留一個(gè),也許更正變量名。(9)C2143:syntaxerror:missing';'before(identifier)'xxxx'編號:C2143直譯:在(標(biāo)志符)“xxxx前”缺少分號。錯誤解析:這是VC6的編譯期最常有的誤報(bào),當(dāng)出現(xiàn)這個(gè)錯誤時(shí),經(jīng)常所指的語句并沒有錯誤,而是它的上一句語句發(fā)生了錯誤。其實(shí),更合適的做法是編譯器報(bào)告在上一句語句的尾部缺少分號。上一句語句的好多種錯誤都會以致編譯器報(bào)出這個(gè)錯誤:上一句語句的尾端真的缺少分號。那么補(bǔ)上就可以了。上一句語句不完滿,也許有明顯的語法錯誤,也許根本不能夠算上一句語句(有時(shí)是沒心中按到鍵盤所致)。若是發(fā)現(xiàn)發(fā)生錯誤的語句是cpp文件的第一行語句,在本文件中檢查沒有錯誤,但其使用雙引號包含了某個(gè)頭文件,那么檢查這個(gè)頭文件,在這個(gè)頭文件的尾部可能有錯誤。(10)errorC4716:'xxx':mustreturnavalue編號:C4716直譯:“xxx必”須返回一個(gè)值。錯誤解析:函數(shù)聲了然有返回值(不為void),但函數(shù)實(shí)現(xiàn)中忘記了return返回值。要么函數(shù)確實(shí)沒有返回值,則更正其返回值種類為void,要么在函數(shù)結(jié)束前返回合適的值。(11)warningC4508:'main':functionshouldreturnavalue;'void'returntypeassumed編號:C4508直譯:main函數(shù)應(yīng)該返回一個(gè)值;void返回值種類被假設(shè)。錯誤解析:函數(shù)應(yīng)該有返回值,聲明函數(shù)時(shí)應(yīng)指明返回值的種類,確實(shí)無返回值的,應(yīng)將函數(shù)返回值聲明為void。若未聲明函數(shù)返回值的種類,則系統(tǒng)默認(rèn)為整型int。此處的錯誤估計(jì)是在main函數(shù)中沒有return返回值語句,而main函數(shù)要么沒有聲明其返回值的種類,要么聲了然。warning種類的錯誤為警告性質(zhì)的錯誤,其意思是其實(shí)不用然有錯,程序還可以夠被成功編譯、鏈接,但可能有問題、有風(fēng)險(xiǎn)。(12)warningC4700:localvariable'xxx'usedwithouthavingbeeninitialized編號:C4700直譯:警告局部變量“xxx在”使用前沒有被初始化。錯誤解析:這是初學(xué)者常有的錯誤,比方以下程序段就會造成這樣的警告,而且程序確實(shí)有問題,應(yīng)加以更正,盡管編譯、鏈接能夠成功——若不更正,x的值終究是多少無法確定,是隨機(jī)的,判斷其可否與3同樣沒有意義,在運(yùn)氣不好的狀況下,可能在調(diào)試程序的機(jī)器上運(yùn)行時(shí),結(jié)果看起來是對的,但更換計(jì)算機(jī)后再運(yùn)行,結(jié)果就不對,初學(xué)者經(jīng)常感覺迷惑。intx;if(x==3)printf("hello");

常有鏈接錯誤(1)errorLNK2001:unresolvedexternalsymbol_main編號:LNK2001直譯:未解決的外面符號:_main。錯誤解析:缺少main函數(shù)??纯磎ain

的拼寫或大小寫可否正確。(2)errorLNK2005:_mainalreadydefinedinxxxx.obj直譯:

LNK2005_main已經(jīng)存在于

xxxx.obj

中了。錯誤解析:直接的原因是該程序中有多個(gè)初次編程時(shí)經(jīng)常犯的錯誤。

(不僅一個(gè))main函數(shù)。這是初學(xué)C++的低年級同學(xué)在這個(gè)錯誤平常不是你在同一個(gè)文件中包含有兩個(gè)main函數(shù),而是在一個(gè)project(項(xiàng)目)中包含了多個(gè)cpp文件,而每個(gè)cpp文件中都有一個(gè)main函數(shù)。惹起這個(gè)錯誤的過程一般是這樣的:你寫達(dá)成了一個(gè)C++程序的調(diào)試,接著你準(zhǔn)備寫第二個(gè)C++文件,于是你可能經(jīng)過右上角的關(guān)閉按鈕關(guān)閉了當(dāng)前的cpp文件字窗口(也許沒相關(guān)閉,這一操作不影響最后的結(jié)果),此后經(jīng)過菜單或工具欄創(chuàng)辦了一個(gè)新的cpp文件,在這個(gè)新窗口中,程序編寫達(dá)成,編譯,此后就發(fā)生了以上的錯誤。原因是這樣的:你在創(chuàng)辦第二個(gè)cpp文件時(shí),沒相關(guān)閉原來的項(xiàng)目,因此你沒心中新的cpp文件加入你上一個(gè)程序所在的項(xiàng)目。切換到“FileView視”圖,張開“SourceFiles節(jié)”點(diǎn),你就會發(fā)現(xiàn)有兩個(gè)文件。在編寫C++程序時(shí),必然要理解什么是Workspace、什么是Project。每一個(gè)程序都是一個(gè)Project(項(xiàng)目),一個(gè)Project能夠編譯為一個(gè)應(yīng)用程序(*.exe),也許一個(gè)動態(tài)鏈接庫(*.dll)。平常,每個(gè)Project下面能夠包含多個(gè).cpp文件,.h文件,以及其他資源文件。在這些文件中,只能有一個(gè)main函數(shù)。初學(xué)者在寫簡單程序時(shí),一個(gè)Project中經(jīng)常只會有一個(gè)cpp文件。Workspace(工作區(qū))是Project的會集。在調(diào)試復(fù)雜的程序時(shí),一個(gè)Workspace可能包含多個(gè)Project,但關(guān)于初學(xué)者的簡單的程序,一個(gè)Workspace經(jīng)常只包含一個(gè)Project。當(dāng)達(dá)成一個(gè)程序今后,寫另一個(gè)程序從前,必然要在“File菜”單中選擇“CloseWorkspace項(xiàng)”,已完滿關(guān)閉前一個(gè)項(xiàng)目,才能進(jìn)行下一個(gè)項(xiàng)目。防范這個(gè)錯誤的另一個(gè)方法是每次寫完一個(gè)C++程序,都把VC6完整關(guān)掉,此后重寫打開VC6,寫下一個(gè)程序。1.解決errorLNK2005:___crtExitProcess已經(jīng)在LIBCMTD.lib(crt0dat.obj)中定義有的時(shí)候,在Debug模式下編譯沒問題,換到Release模式就發(fā)生一堆問題.典型的例子,就是因?yàn)閏++runtimelibrary設(shè)定不同樣,所造成的重複定義連結(jié)錯誤.而另一個(gè)常見的例子是專案與library使用不同樣的字元會集設(shè)定(如:一個(gè)用UnicodeCharacterSet,另一個(gè)用Multi-ByteCharacterSet)這個(gè)錯誤發(fā)生原因,有可能是1.你link的lib使用C++Multi-threadedDLL(/MD)2.而你的source使用的C++runtimelibrary是Multi-threaded(/MT)導(dǎo)致重複定義解決方法:兩個(gè)使用同樣的C++runtimelibrary.比方都使用static的Multi-threaded(/MT).2.錯誤1errorLNK2005:"private:__thiscalltype_info::type_info(classtype_infoconst&)"(??0type_info@@AAE@ABV0@@Z)已經(jīng)在LIBCMT.lib(typinfo.obj)義MSVCRTD.lib

中定項(xiàng)目->屬性->c/C++->代碼生成->運(yùn)行時(shí)庫設(shè)置為:多線程調(diào)試DLL(/MDd)被引用的庫和調(diào)用的程序編譯選項(xiàng)不同樣,需要改成一致后編譯#pragmaonce與#ifndef的差異為了防范同一個(gè)文件被include多次#ifndef方式#pragmaonce方式在能夠支持這兩種方式的編譯器上,兩者并沒有太大的差異,但是兩者依舊還是有一些細(xì)微的差異。方式一:#ifndef__SOMEFILE_H__#define__SOMEFILE_H__......//一些聲明語句#endif方式二:#pragmaonce......//一些聲明語句#ifndef的方式依賴于宏名字不能夠矛盾,這不僅能夠保證同一個(gè)文件不會被包含多次,也能保證內(nèi)容完滿同樣的兩個(gè)文件不會被不小心同時(shí)包含。自然,缺點(diǎn)就是若是不同樣頭文件的宏名不小心“撞車”,可能就會以致頭文件明顯存在,編譯器卻硬說找不到聲明的狀況#pragmaonce則由編譯器供應(yīng)保證:同一個(gè)文件不會被包含多次。注意這里所說的“同一個(gè)文件”是指物理上的一個(gè)文件,而不是指內(nèi)容同樣的兩個(gè)文件。帶來的好處是,你不用再費(fèi)勁想個(gè)宏名了,自然也就不會出現(xiàn)宏名碰撞惹起的奇怪問題。對應(yīng)的缺點(diǎn)就是若是某個(gè)頭文件有多份拷貝,本方法不能夠保證他們不被重復(fù)包含。自然,對照宏名碰撞惹起的“找不到聲明”的問題,重復(fù)包含更簡單被發(fā)現(xiàn)并修正。方式一由語言支持因此移植性好,方式二

能夠防范名字矛盾4.errorLNK2019:無法解析的外面符號PathCombine是Shellapi需要引入庫#pragmacomment(lib,"shlwapi.lib")5.errorC2662:"MyClass::GetName( )“MyClass&”

__imp__PathCombineW”:不能夠?qū)ⅰ皌his指”針從“constMyClass

”變換為boolMyClass::operator==(constMyClass*n1)const{returnGetName( )==n1->GetName( );}原因是不能夠在const函數(shù)中調(diào)用對象的非const方法,MyClass中的GetName( )必定是const的。6.template模板搞死了模板聲明和定義必定在同一個(gè)文件中,而且只有實(shí)例話模板種類時(shí)才編譯模板實(shí)例7.errorC2275:

“MyClass”將:此種類用作表達(dá)式非法

MyClass.Instance( );原因:

Instance

是靜態(tài)方法,用

.引用會出錯。應(yīng)該是

MyClass::Instance( )8.errorLNK2019:

無法解析的外面符號

"public:__thiscallMyClass(void)原因:只聲了然構(gòu)造函數(shù),MyClass( );,但不決義。能夠定義空函數(shù),也許直接說明掉,使用默認(rèn)構(gòu)造函數(shù)。9.errorC2504:“testing”未:定義基類classPackToolTest:testing.Test{}原因:Test是testing命名空間下的一個(gè)類,需要用域操作符,testing::Test還有一個(gè)問題,缺少基類繼承權(quán)限(public、protected、private)errorC2864:“MyClass::_nullpack”只:有靜態(tài)常量整型數(shù)據(jù)成員才能夠在類中初始化classMyClass{string_nullpack="test";}原因:c++中,成員變量不能夠在聲明時(shí)初始化,而是在構(gòu)造函數(shù)初始化列表中先初始化11.errorLNK2019:無法解析的外面符號_WinMain@16intmain( )原因:由于創(chuàng)辦的是Win32Project,和Win32consoleProject的鏈接庫不同樣方法1:在程序最開始的地方加上以下語句#pragmacomment(linker,"/subsystem:console")方法2:project>>setting>>在link的projectoptions中將/subsystem:windows(console)刪了12.近似“已經(jīng)在msvcprtd.lib(MSVCP80D.dll)中定義”問題vs2005Debug/Release需要分別配制解析一下錯誤根源,會發(fā)現(xiàn):1.錯誤根源主若是重復(fù)定義的問題,而且重復(fù)定義的基本上都是VCRuntime和StandardC++Library中的函數(shù)2.LIBCMT和LIBCPMT為Release下的Lib,原來不應(yīng)該出

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論