VC6編譯與鏈接過程中常見的出錯提示_第1頁
VC6編譯與鏈接過程中常見的出錯提示_第2頁
VC6編譯與鏈接過程中常見的出錯提示_第3頁
VC6編譯與鏈接過程中常見的出錯提示_第4頁
VC6編譯與鏈接過程中常見的出錯提示_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Visual C+ 6.0編程環(huán)境的使用目錄 TOC o 1-5 h z 4 編譯與鏈接過程中常見的出錯提示 1 HYPERLINK l bookmark4 o Current Document 4.1 編譯、鏈接問題的解決方法 1 HYPERLINK l bookmark6 o Current Document 努力讀懂VC報告的錯誤與警告信息1定位問題所在行 1 HYPERLINK l bookmark8 o Current Document 解決問題的方法 1避免被VC誤導(dǎo)1編譯鏈接問題的解決不代表程序正確2 HYPERLINK l bookmark12 o Current Docume

2、nt 常用單詞與術(shù)語 2 HYPERLINK l bookmark14 o Current Document 常見編譯錯誤信息 4 HYPERLINK l bookmark16 o Current Document error C2001: newline in constant 4 HYPERLINK l bookmark18 o Current Document error C2017: illegal escape sequence 4 HYPERLINK l bookmark20 o Current Document error C2015: too many characters i

3、n constant 4error C2137: empty character constant 5error C2018: unknown character 0 x# 5error C2041: illegal digit # for base 8 5error C2065: xxxx : undeclared identifier 5 HYPERLINK l bookmark22 o Current Document error C2086: xxxx : redefinition 6 HYPERLINK l bookmark24 o Current Document error C2

4、374: xxxx : redefinition; multiple initialization 6 HYPERLINK l bookmark26 o Current Document error C2143: syntax error : missing ; before (identifier) xxxx或before type6 HYPERLINK l bookmark28 o Current Document error C4716: xxx : must return a value 7error C2006: #include expected a filename, found

5、 ( / found identifier / found newline 7 HYPERLINK l bookmark30 o Current Document error C2039: aver : is not a member of STU 7 HYPERLINK l bookmark32 o Current Document error C2043: illegal break7 HYPERLINK l bookmark34 o Current Document error C2046: illegal case / error C2047: illegal default 8err

6、or C2050: switch expression not integral 8error C2051: case expression not constant 8 HYPERLINK l bookmark36 o Current Document error C2079: da uses undefined struct data 8error C2081: num2 : name in formal parameter list illegal 9 HYPERLINK l bookmark38 o Current Document error C2122: num2 : protot

7、ype parameter in name list illegal 9 HYPERLINK l bookmark40 o Current Document error C2082: redefinition of formal parameter aver9 HYPERLINK l bookmark42 o Current Document error C2172: fread : actual parameter is not a pointer : parameter 1 9 HYPERLINK l bookmark44 o Current Document error C2198: F

8、indMin : too few actual parameters 9 HYPERLINK l bookmark46 o Current Document error C2087: : missing subscript 10 HYPERLINK l bookmark48 o Current Document error C2133: num : unknown size 10error C2106: = : left operand must be l-value 10 HYPERLINK l bookmark50 o Current Document error C2108: subsc

9、ript is not of integral type 10error C2109: subscript requires array or pointer type 10 HYPERLINK l bookmark52 o Current Document error C2181: illegal else without matching if 11error C2296: % : illegal, left operand has type double 11 HYPERLINK l bookmark54 o Current Document fatal error C1004: une

10、xpected end of file found 11 HYPERLINK l bookmark56 o Current Document fatal error C1021: invalid preprocessor command defint/hinclude 11 HYPERLINK l bookmark58 o Current Document fatal error C1083: Cannot open include file: sdtio.h: No such file or directory 11 HYPERLINK l bookmark60 o Current Docu

11、ment error C2220: warning treated as error - no object file generated 11 HYPERLINK l bookmark62 o Current Document 4.4 常見編譯警告信息 11 HYPERLINK l bookmark64 o Current Document warning C4129: m : unrecognized character escape sequence 12 HYPERLINK l bookmark66 o Current Document warning C4508: main : fu

12、nction should return a value; void return type assumed 12 HYPERLINK l bookmark68 o Current Document warning C4098: change : void function returning a value 12 HYPERLINK l bookmark70 o Current Document warning C4700: local variable xxx used without having been initialized 12warning C4013: print undef

13、ined; assuming extern returning int 12 HYPERLINK l bookmark72 o Current Document warning C4047: = : int * differs in levels of indirection from int 13warning C4024: fun : different types for formal and actual parameter 2 13 HYPERLINK l bookmark76 o Current Document warning C4133: function : incompat

14、ible types - from int 128 to char * 13 HYPERLINK l bookmark78 o Current Document warning C4022: fread : pointer mismatch for actual parameter 1 14warning C4018: : signed/unsigned mismatch 14warning C4305: = : truncation from const double to float 14 HYPERLINK l bookmark82 o Current Document warning

15、C4553: = : operator has no effect; did you intend =? 15 HYPERLINK l bookmark84 o Current Document warning C4715: fun : not all control paths return a value 15 HYPERLINK l bookmark86 o Current Document 4.5 常見鏈接錯誤 16 HYPERLINK l bookmark88 o Current Document error LNK2001: unresolved external symbol _

16、main 16 HYPERLINK l bookmark90 o Current Document error LNK2005: _main already defined in xxxx.obj 16 HYPERLINK l bookmark92 o Current Document fatal error LNK1168: cannot open Debug/P901.exe for writing 17 HYPERLINK l bookmark94 o Current Document 4.6TurboCV2.0編譯錯誤信息的英漢對照表174 編譯與鏈接過程中常見的出錯提示4.1編譯、鏈

17、接問題的解決方法努力讀懂VC報告的錯誤與警告信息編譯、鏈接過程中,主要由于初學(xué)和錄入階段的擊鍵失誤,VC經(jīng)常會提示程序有錯(語法 和拼寫問題,肯定不會指明算法有問題,否則就不用編程了)。遇到這些英文的提示時,不少 同學(xué)無從下手。一定要克服畏難情緒和一看英文就怕的心理,憑自己能考上大學(xué)的英語水平, 只要仔細、一個單詞一個單詞地看,這些英文、包括在線幫助中的英文語句應(yīng)基本上能看懂 個別單詞實在不認識就查一查,做IT的哪能不學(xué)英語,這本身也是在日常生活中學(xué)習英語的 機會。定位問題所在行 對于編譯過程中的出錯提示,即便沒有完全理解、似懂非懂,也沒有很大關(guān)系,只要雙擊Out pu t窗口中的出錯信息就可

18、以自動跳到出錯的程序行,仔細查看該行或其前一、二行(特 別是在編譯器所報告的行找不到問題時,通常問題可能出現(xiàn)在其前一行,極少在其前2行), 加上經(jīng)驗的逐漸積累和人類具有舉一反三、觸類旁通的自我學(xué)習進步能力,解決這些簡單問 題并非難事。當然,能看懂并理解出錯的原因則更好。解決問題的方法初學(xué)者解決這些出錯提示應(yīng)當遵循的原則是:先解決最前面的、大概知道其意思的、能 夠解決的問題,且解決一個后立即重新編譯,很可能一下子就解決了多個問題,因為一個錯 誤可能導(dǎo)致編譯器連鎖反應(yīng)報告多個錯誤。若同一行報告了多個錯誤,則先解決能看懂的、 知道出錯原因的問題。若確信某行存在問題,但因語法、參數(shù)格式掌握不好等原因而

19、無法修正,則可將光標移 至相應(yīng)的關(guān)鍵字或函數(shù)名上按F1鍵以查看系統(tǒng)幫助中的語法、參數(shù)說明以及示例程序,或者 查看網(wǎng)站上考試時開放的C語言學(xué)習資料,將其中的示例代碼復(fù)制到程序中進行對照,一般均 能解決問題。避免被VC誤導(dǎo)必須指出的是,計算機畢竟是機器,編譯器所報錯誤和警告提示不一定是準確的,編譯 器給出的信息僅供參考(大多數(shù)時候是準確的),最終需要發(fā)揮人的智慧來判斷并解決問題。 如VC6對以下代碼將報告“ syntax error : missing before != ”,但實際卻是while 后少了一個“(”,其報告此時就是誤導(dǎo),但其所指行數(shù)存在問題卻是準確的,至少幫我們指 明的出問題的位置

20、。while (ch = getchar() != n & ch != EOF) 再如VC6對以下代碼將報告第4行錯誤 “error C2085: main : not in formal parameter list”,但實際卻是第1行末少了;。float hanshu(int cs, int n)int main(void)printf(Hello World!n);return 0;編譯鏈接問題的解決不代表程序正確初學(xué)者常有這樣的迷惑:程序的編譯、鏈接過程均正確,沒有任何錯誤或警告信息,但 結(jié)果總是不對,找不到原因。程序編譯、鏈接時沒有任何錯誤或警告信息,只能代表沒有語法錯誤和模塊引用錯

21、誤, 但并不代表這樣的程序能夠做任何事情。例如,以下程序沒有任何編譯、鏈接問題,但它能 解決什么問題呢?#include int main(void)printf(Hello World!n);return 0;程序的運行結(jié)果不正確,應(yīng)該是程序的算法本身有問題或算法的實現(xiàn)有問題,數(shù)據(jù)處理 錯誤所致,應(yīng)仔細檢查源程序的設(shè)計問題。4.2常用單詞與術(shù)語base 8:以8為基礎(chǔ),八進制。Charac ters: 字符。Commen t:注釋。Cons tan t:常量,例如整型、浮點型(又分floa t、double)、字符、字符串常量。Digi t:數(shù)字。Escape sequence :轉(zhuǎn)義序列。

22、Expressio n:表達式。Function:函數(shù)formal parame ter/ac tual parame ter:形式上的參數(shù),形參/實際的參數(shù),實參。Identifier:標識符,變量、函數(shù)等的名字。Indirection:間接尋址。Macro:宏,#define所定義。Operand/opera tor:操作數(shù)/操作符。Parame ter:參數(shù)。Poi nter:扌旨針。Preprocessor:預(yù)處理,與#define、#include相關(guān)Pro tot ype:原型。signed/unsigned:有符號的/無符號的。Symbo l:符號。Subscrip t:下標。T

23、runca tion: 截斷,舍去。Type:(數(shù)據(jù))類型。Value :值。Variable, local variable:變量,局部變量。l-value:左值,賦值操作符(=)左邊的值,可理解為等號左邊的能存儲數(shù)據(jù)的變量。Extern,external:外部,本文件以外的其它模塊所定義的變量或函數(shù)。Assumed, assuming:假定,假設(shè),默認為。Conver t:轉(zhuǎn)換。Differs, different:不同,不一致,有差異的。Fat al:致命的。Illegal:非法,不合法。Incompa tible :不相容的,不兼容的。Initialization,initialize

24、d:初始化,給變量賦一個確定的值。Int egral:完整的,整數(shù)的。Invalid:無效的。Ma tching/misma tch:匹配/不匹配。Missing:缺少。Redefi nition:重定義。Syntax:句法,語法。Declared/undeclared: 已聲明的/未聲明的。Undefined :未定義;Unexpec ted/expec ted:意外,意想不到,不希望的/預(yù)期的、希望的。Unknown: 未知。Unrecognized:無法識別的。Unresolved :懸而未決,尚未解決,還未落實4.3常見編譯錯誤信息error C2001: newline in con

25、stant直譯:在常量中出現(xiàn)了換行。錯誤分析:字符串常量、字符常量中是否有換行。字符串常量的尾部是否漏掉了雙引號。某個字符串常量中是否出現(xiàn)了雙引號字符“”,但是沒有使用轉(zhuǎn)義符“”。某個字符常量的尾部是否漏掉了單引號。是否在某句語句的尾部,或語句的中間誤輸入了一個單引號或雙引號。導(dǎo)致錯誤的例句:正確:printf(Hello World!n);在屏幕上顯示Hello World!出錯:printf(Hello World!n); 或printf(Hello World!);出錯:printf(HelloWorld!n);正確:printf(Hello World!n);在屏幕上顯示Hello W

26、orld!出錯:printf(Hello World!n);正確:putchar(A);或ch= A;或num = 3;出錯:putchar(A);或ch= A;或num = 3; 或num= 3; error C2017: illegal escape sequence 直譯:非法的轉(zhuǎn)義序列。錯誤分析:在字符和字符串常量中,轉(zhuǎn)義字符是以反斜線開頭的字符序列,有特定的含 義,例如n表示換行,表示一個反斜線,表示單引號,表示雙引號, t表 示水平制表,b表示退格。若是字符常量,必須用兩個單引號引起來,若是字符串常量, 則必須用兩個雙引號引起來,否則會報本錯誤。導(dǎo)致錯誤的例句:正確:putchar

27、(n); 或printf (Hello World!n);出錯:putchar(n);或printf(Hello World!n);error C2015: too many characters in constant直譯:字符常量中的字符過多。錯誤分析:單引號表示字符型常量。一般的,單引號中必須有且只能有一個字符(使用轉(zhuǎn) 義符時,轉(zhuǎn)義符所表示的字符當作一個字符看待),如果單引號中的字符數(shù)多于4個,就會引 發(fā)這個錯誤。另外,如果語句中某個字符常量缺少右邊的單引號,也會引發(fā)這個錯誤,例如:if (x = x | x = y) 值得注意的是,如果單引號中的字符數(shù)是2-4個,編譯不報錯,輸出結(jié)果是

28、這幾個字母的 ASCII碼作為一個整數(shù)(int, 4B)整體看待的數(shù)字。error C2137: empty character constant直譯:空字符常量。 錯誤分析:原因是連用了兩個單引號,而中間沒有任何字符,這是不允許的。導(dǎo)致錯誤的例句:正確:ch =;錯誤:ch =;error C2018: unknown character 0 x#直譯:未知字符Ox#。錯誤分析:Ox#是字符ASC碼的16進制表示法。這里說的未知字符,通常是指全角符號(包 括空格)、字母、數(shù)字,或者直接輸入了漢字。如果全角字符和漢字用雙引號包含起來,則成 為字符串常量的一部分,是不會引發(fā)這個錯誤的。導(dǎo)致錯誤的

29、例句:正確:int num; 或int num; 或int numl, num2; 或num2 = (numl + 3) / 2;錯誤:int num; 或int num;或int numl, num2; 或num2=(num1 +3) / 2;注:上行中int num;看似無錯,實際上在t和n之間移動光標時就可發(fā)現(xiàn)光標一下子 走了兩個字符的距離卩in t和num之間被輸入了一個全角的空格,這是較難發(fā)現(xiàn)的。error C2O4l: illegal digit # for base 8 直譯:在八進制中出現(xiàn)了非法的數(shù)字#。(這個數(shù)字#通常是8或者9)。錯誤分析:如果某個數(shù)字常量以“0”開頭(單純

30、的數(shù)字0除外),那么編譯器會認為這是 一個8進制數(shù)字。例如:“089”、“078”、“093”都是非法的,而“071”是合法的,等同于是 進制中的“57”。error C2065: xxxx : undeclared identifier直譯:標識符“ xxxx ”未定義。錯誤分析:首先,解釋一下什么是標識符。標志符是程序中出現(xiàn)的除關(guān)鍵字之外的詞, 通常由字母、數(shù)字和下劃線組成,不能以數(shù)字開頭,不能與關(guān)鍵字重復(fù),并且區(qū)分大小寫。 變量名、函數(shù)名、類名、常量名等等,都是標志符。所有的標志符都必須先定義,后使用。 標志符有很多種用途,所以錯誤也有很多種原因。如果“ xxxx ”是一個變量名,那么通

31、常是程序員忘記了定義這個變量,或者拼寫錯誤、 大小寫錯誤所引起的,所以,首先檢查變量名是否正確。如果“ XXXX ”是一個函數(shù)名,那就懷疑函數(shù)名是否沒有定義??赡苁瞧磳戝e誤或大小 寫錯誤,當然,也有可能是你所調(diào)用的函數(shù)根本不存在。還有一種可能,你寫的函數(shù)在你調(diào) 用所在的函數(shù)之后,而你有沒有在調(diào)用之前對函數(shù)原形進行申明。將C語言的保留關(guān)鍵字寫錯,例如將else寫else也會導(dǎo)致本錯誤的出現(xiàn)。如果“xxxx”是一個庫函數(shù)的函數(shù)名,比如“ sqrt”、“fabs”,那么看看你在cpp文件 已開始是否包含了這些庫函數(shù)所在的頭文件(.h文件)。例如,使用“ sqrt”函數(shù)需要頭文件 math.h。如果“

32、xxxx”就是“cin”或“cout”,那么一般是沒有包含“iostream.h”。如果“ xxxx ”是一個類名,那么表示這個類沒有定義,可能性依然是:根本沒有定義 這個類,或者拼寫錯誤,或者大小寫錯誤,或者缺少頭文件,或者類的使用在申明之前。標志符遵循先申明后使用原則。所以,無論是變量、函數(shù)名、類名,都必須先定義, 后使用。如使用在前,申明在后,就會引發(fā)這個錯誤。C+的作用域也會成為引發(fā)這個錯誤的陷阱。在花括號之內(nèi)變量,是不能在這個花括號 之外使用的。類、函數(shù)、if、do(while)、for所引起的花括號都遵循這個規(guī)則。前面某句語句的錯誤也可能導(dǎo)致編譯器誤認為這一句有錯。如果你前面的變量

33、定義語 句有錯誤,編譯器在后面的編譯中會認為該變量從來沒有定義過,以致后面所有使用這個變 量的語句都報這個錯誤。如果函數(shù)申明語句有錯誤,那么將會引發(fā)同樣的問題。error C2086: xxxx : redefi nition直譯:“xxxx”重復(fù)定義。錯誤分析:變量“xxxx”在同一作用域中定義了多次。檢查“ xxxx”的每一次定義,只 保留一個,或者更改變量名。error C2374: xxxx : redefinition; multiple initialization直譯:“xxxx”重復(fù)申明,多次初始化。錯誤分析:變量xxxx”在同一作用域中定義了多次,并且進行了多次初始化。檢查x

34、xxx” 的每一次定義,只保留一個,或者更改變量名。error C2143: synt ax error : missing ; before (ide nti fier) xxxx或before type直譯:語法錯誤:在(標志符)“xxxx”或“類型”前缺少分號。錯誤分析:這是VC6的編譯期最常見的誤報,當出現(xiàn)這個錯誤時,往往所指的語句并沒有 錯誤,而是它的上一句語句發(fā)生了錯誤。其實,更合適的做法是編譯器報告在上一句語句的 尾部缺少分號。上一句語句的很多種錯誤都會導(dǎo)致編譯器報出這個錯誤:上一句語句的末尾真的缺少分號。那么補上就可以了。上一句語句不完整,或者有明顯的語法錯誤,或者根本不能算上

35、一條語句(有時候是無 意中按到鍵盤所致)。變量應(yīng)在一個程序塊的開始處定義,但程序中卻違反了此規(guī)則,例如以下代碼將導(dǎo)致本錯誤(error C2143: syntax error : missing before type)的出現(xiàn):int num1; printf(Hello World!n);int num2;將以上代碼調(diào)整如下即可消除本錯誤:int num1;int num2; printf(Hello World!n);如果發(fā)現(xiàn)發(fā)生錯誤的語句是cpp文件的第一行語句,在本文件中檢查沒有錯誤,但其使 用雙引號包含了某個頭文件,那么檢查這個頭文件,在這個頭文件的尾部可能有錯誤。error C47

36、16: xxx : must return a value直譯:“XXX”必須返回一個值。錯誤分析:函數(shù)聲明了有返回值(不為void),但函數(shù)實現(xiàn)中忘記了ret urn返回值。要么 函數(shù)確實沒有返回值,則修改其返回值類型為void,要么在函數(shù)結(jié)束前返回合適的值。error C2006: #include eXpected a filename,found ( / found identifier / found newline直譯:#include后需跟上一個文件名,卻出現(xiàn)了( / 標識符/ 換行。錯誤分析:正確的#include舉例為#include 或#訕小口小6 user.h,但若錯寫

37、為以下之一,則編譯器將報告本錯誤:#include (user.h) 或#include user.h 或#includeerror C2039: aver : is not a member of STU直譯:aver不是結(jié)構(gòu)體STU的成員。錯誤分析:程序中定義了結(jié)構(gòu)體類型STU,但其中并沒有定義一個名字叫aver的成員,估 計是忘了定義或成員名稱拼寫錯誤、前后不一致(例如定義結(jié)構(gòu)體成員aver時錯寫為avre或 Aver)。error C2043: illegal break直譯:非法/無效的break。錯誤分析:break的作用是跳出循環(huán)(for,while)或switch,但程序中br

38、eak的位置卻并非 如此,例如以下代碼將導(dǎo)致本錯誤的出現(xiàn):while (num1 6) ;break;error C2046: illegal case / error C2047: illegal default直譯: 非法的case /非法的default。錯誤分析:case和default應(yīng)處于switch語句里,但程序中其位置可能并非如此,例如以 下代碼將導(dǎo)致本錯誤的出現(xiàn):switch (num1) ;case 1: default: num2+;error C2050: switch expression not integral直譯:swi tch所依據(jù)的表達式不是整數(shù)。錯誤分析:

39、語句“switch (表達式)里的表達式的值必須是整數(shù)(char也可),例如以下 代碼將導(dǎo)致本錯誤的出現(xiàn):float num1;switch ( num1/10 )將以上代碼調(diào)整如下即可消除本錯誤:switch ( (int)num1/10 )error C2051: case expression not constant直譯:case表達式不是常量。錯誤分析:語句“case表達式”里的表達式的值必須是常量,不能使用變量,例如以下 代碼將導(dǎo)致本錯誤的出現(xiàn):switch () case A:注:以上代碼出錯的原因可能是本應(yīng)為“case A:”,改為“case A: ”也將導(dǎo)致本錯 誤的出現(xiàn)。e

40、rror C2079: da uses undefined st ruc t da ta直譯:定義變量da時使用了未定義的結(jié)構(gòu)體data錯誤分析:可能是結(jié)構(gòu)體類型名da ta前后不一致引起,例如以下代碼即會導(dǎo)致本錯誤: struct Dataint num; char name10;struct data da;error C2081: num2 : name in formal parameter list illegal直譯:名字num2在函數(shù)的形參列表中不合法。 錯誤分析:以下代碼將導(dǎo)致本錯誤的出現(xiàn):int getMax(int num1, num2)將第一行代碼改為“int getMa

41、x(int numl, int num2)即完成修正。error C2122: num2 : prototype parameter in name list illegal直譯:名字num2在函數(shù)的原型參數(shù)在名字列表中不合法。 錯誤分析:以下代碼將導(dǎo)致本錯誤的出現(xiàn):int getMax(num1, int num2)將第一行代碼改為“int getMax(int numl, int num2)即完成修正。error C2082: redefinition of formal parameter aver直譯:重定義形參aver。錯誤分析:在函數(shù)的形參里已有了變量aver的定義,在函數(shù)體中卻又

42、再次定義了變量 aver,如以下代碼:int getNum(int num1, int num2, int aver)int sum, aver;修改方案為:若aver不需要作為函數(shù)的必須參數(shù),則從形參表的將其去掉;若必作參數(shù), 則在函數(shù)體中將其定義去掉。error C2172: fread : actual parameter is not a pointer : parameter 1 直譯:調(diào)用函數(shù)fread 時,參數(shù)1的實參不是指針。錯誤分析:函數(shù)fread 要求其第一參數(shù)為一指針,以下代碼將導(dǎo)致本錯誤:FILE *fp;float num; fread(num, sizeof(num

43、), 1, fp);修改方案為:將fread所在行代碼改為:fread(&num, sizeof(num), 1, fp);error C2198: FindMin : too few actual parameters直譯:調(diào)用函數(shù)FindMin 時,實參個數(shù)太少。錯誤分析:例如,函數(shù)FindMin 被定義為有3個參數(shù),但使用FindMin 時卻只給了2個 參數(shù),就會導(dǎo)致本錯誤的出現(xiàn)。error C2087: : missing subscript直譯: :缺少下標。 錯誤分析:二維數(shù)組作為函數(shù)的形參時,容易出現(xiàn)本錯誤,如以下代碼即出錯: int fun(int num, int n);修改

44、方案為指明行的大小,若傳遞的二維數(shù)組實際為int array58,則上行改為“int fun(int num8, int n);即解決問題。error C2133: num : unknown size直譯:定義數(shù)組num時,未知數(shù)組的大小。錯誤分析:定義數(shù)組時(不是定義函數(shù)的形參),若未提供初始化數(shù)據(jù),則必須指明數(shù)組 的大小,如以下代碼即出錯:int num;error C2106: = : left operand must be l-value 直譯:對于賦值操作=,其左操作數(shù)必須是左值(即可以存儲數(shù)據(jù)的,一般是變量)。錯誤分析:這種錯誤一般發(fā)生在if語句中,例如將if (3 = num

45、)寫成了if (3 = num)。 注意,在比較一個變量之值和一個常量是否相等時,大多數(shù)的企業(yè)都要求將常量寫在左邊, 以防止出現(xiàn)將=誤寫為=若將變量寫在左邊,則是合法的表達式,編譯器因此將無法 發(fā)現(xiàn)該錯誤而留下事故隱患。error C2108: subscript is not of integral type 直譯:數(shù)組下標不是整數(shù)類型。錯誤分析:數(shù)組的下標必須是整數(shù),如下代碼將導(dǎo)致本錯誤的出現(xiàn):int num10;float i=1;numi = 3;error C2109: subscript requires array or pointer type 直譯:下標引用需要數(shù)組或指針類型

46、。錯誤分析:對于數(shù)組或指針,可以使用下標的方式來訪問相對于數(shù)組或指針起始地址若 干位置的存儲單元的數(shù)據(jù),以下代碼是正確的:int num10, *pArr;pArr = num;num3 = 100; pArr4 = 120;其中num3表示以數(shù)組num首地址為起點的往后第3個單元,pArr4表示以指針pArr所指 位置(此例中實際上是數(shù)組num的首地址)為起點的往后第4個單元(等價于num4)。若將其中 的 “int num10, *pArr;改為 “int num10, pArr;或“int num, *pArr;,均將出現(xiàn) 本錯誤。error C2181: illegal else wi

47、thout matching if直譯:沒有與之相匹配的if, else是不合法的。錯誤分析:有if才可能有else,else總是和if緊緊相對應(yīng)。有可能是過多的if/else嵌套 導(dǎo)致缺少if而沒有配對,但以下代碼可能更普遍(if所在行尾多了;,導(dǎo)致if在該處結(jié)束): if (num 3) ;elseerror C2296: % : illegal, left operand has type double 直譯:運算(模運算、求余運算)不合法,因為其左操作數(shù)的類型是double 。 錯誤分析:運算%要求參加運行的左右兩個數(shù)的數(shù)據(jù)類型為整型。fatal error C1004: unexpe

48、cted end of file found 直譯:意外的文件結(jié)束。錯誤分析:程序代碼還沒有結(jié)束,但卻發(fā)現(xiàn)文件已結(jié)束,原因一般是少了右花括號 所致通常是花括號多時,沒有嚴格配對造成,此時只要調(diào)整縮進格式,將花括號成對對 齊,細心并耐心一點,便能發(fā)現(xiàn)問題所在。fatal error C1021: invalid preprocessor command defint/hinclude直譯:無效的預(yù)處理命令defin t或hinclude錯誤分析:應(yīng)該是將#define寫成了 #defin t、將#include寫成了 #hinclude所致。fatal error C1083: Cannot o

49、pen include file: sdtio.h: No such file or directory直譯:無法打開包含文件sdtio.h:原因是沒有這樣的文件或目錄。錯誤分析:文件名拼寫錯誤,此處本應(yīng)是寫s tdio.h。error C2220: warning treated as error - no object file generated 直譯:對程序的警告視為出錯處理,沒有目標文件生成。錯誤分析:系統(tǒng)使用了嚴格的編譯選項,不允許程序中出現(xiàn)編譯警告提示。為解決此問 題,請修改程序,以消除相應(yīng)的警告信息。4.4常見編譯警告信息warning類型的信息為警告性質(zhì),其意思是并不一定有錯

50、,程序仍可以被成功編譯、鏈接, 但可能有問題、有風險,特別是在實際工作中,應(yīng)該認真對待,消除所有的警告提示,因為 這往往會埋下工程事故隱患。在計算中心的的C語言考試系統(tǒng)中,為了鍛煉培養(yǎng)學(xué)生的嚴謹作 風和素質(zhì),不允許程序中出現(xiàn)警告提示且檢查的警告內(nèi)容比默認值更多,若有警告則直接做 零分處理,請注意考試評分系統(tǒng)給出的提示。warning C4129: m : unrecognized character escape sequence直譯:無法識別的字符轉(zhuǎn)義序列m。錯誤分析:在字符和字符串常量中,轉(zhuǎn)義字符是以反斜線開頭的字符序列,有特定的含 義,例如n表示換行,表示一個反斜線,表示單引號,表示雙引

51、號, t表 示水平制表,b表示退格,這些均是合法的轉(zhuǎn)義字符。但若程序中出現(xiàn)了未定義的、編譯 器不知其含義的轉(zhuǎn)義序列,則會出現(xiàn)本警告。導(dǎo)致錯誤的例句:正確:printf(Hello World!n);在屏幕上顯示Hello World!出錯:printf(Hello World!m);warning C4508: main : function should return a value; void return type assumed直譯:main函數(shù)應(yīng)該返回一個值;void返回值類型被假定。錯誤分析:函數(shù)應(yīng)該有返回值,聲明函數(shù)時應(yīng)指明返回值的類型,確實無返回值的,應(yīng) 將函數(shù)返回值聲明為vo

52、id。若未聲明函數(shù)返回值的類型,則系統(tǒng)默認為整型in t。此處的錯誤 估計是在main函數(shù)中沒有re tu rn返回值語句,而main函數(shù)要么沒有聲明其返回值的類型,要 么聲明了。warning C4098: change : void function returning a value直譯:函數(shù)change的類型是void,但卻返回了值。錯誤分析:函數(shù)change的類型被定義成了void,就不應(yīng)該返回值。要么是函數(shù)類型 定義有誤,要么是返回語句不該帶值返回。warning C4700: local variable xxx used without having been initiali

53、zed直譯:警告局部變量“ xxx ”在使用前沒有被初始化。錯誤分析:這是初學(xué)者常見的錯誤,例如以下程序段就會造成這樣的警告,而且程序的 確有問題,應(yīng)加以修改,盡管編譯、鏈接可以成功若不修改,x的值到底是多少無法確定, 是隨機的,判斷其是否與3相同沒有意義,在運氣不好的情況下,可能在調(diào)試程序的機器上運 行時,結(jié)果看起來是對的,但更換計算機后再運行,結(jié)果就不對,初學(xué)者往往感到迷惑。int x;if (x=3) printf(hello);warning C4013: print undefined; assuming extern returning int直譯:“print”未定義,編譯時假設(shè)

54、其是一個外部定義的函數(shù)并且返回值類型為int。錯誤分析:一般有三種原因會導(dǎo)致此警告:函數(shù)的拼寫不正確,少寫了字母、字母大小寫不同或字母順序錯誤(如main與mian), 如此處實際上應(yīng)為prin tf。拼寫正確且為庫函數(shù)的名稱,但未#include該函數(shù)的頭文件。拼寫正確但函數(shù)為用戶自定義函數(shù),沒有為其在使用前做函數(shù)原型的聲明(一般應(yīng)將函 數(shù)原型聲明放在所有函數(shù)之前)。將帶括號的保留關(guān)鍵字,如if、while、for、switch等拼寫錯誤(大小寫不同也算), 編譯器誤認為是函數(shù)調(diào)用。warning C4047: = : int * differs in levels of indirecti

55、on from int 直譯:“賦值”時,int *與int 在間接尋址級別、引用層次上是不一致的,即二者 的數(shù)據(jù)類型含義與使用是有差別的,可能導(dǎo)致問題。錯誤分析:將一個整型變量直接賦值(變量前未加&)給一個指針變量即會導(dǎo)致此警告提 示,除非強制轉(zhuǎn)換,例如對于int num=3, *p,語句p二num即導(dǎo)致本警告。warning C4024: fun : different types for formal and actual parameter 2 直譯:使用函數(shù)“ fun ”時,其第2個實參的類型與定義時規(guī)定的形參的類型不相同。 錯誤分析:調(diào)用函數(shù)時,實參類型錯誤。以下代碼即可導(dǎo)致此警告

56、提示:void fun(int a, int num)int main(void)int num1=5;fun(3, num1);warning C4133: function : incompatible types - from int 128 to char *直譯:調(diào)用函數(shù)時,參數(shù)的數(shù)據(jù)類型不兼容一一從int 128到char *。錯誤分析:調(diào)用函數(shù)時,參數(shù)的數(shù)據(jù)類型應(yīng)當一致,造成本錯誤的原因可能是實際的 類型定義有誤,或者有多個參數(shù)時,參數(shù)的順序錯誤或忘了某個參數(shù)以致參數(shù)錯位例如 “fscanf(fp, %d, &num); ”誤寫為“ fscanf(%d, & num);” 將導(dǎo)致

57、類似的錯誤。以下代碼將導(dǎo)致本錯誤,原因是函數(shù)gets的參數(shù)類型在頭文件st dio.h中被定義為char *,但使用時使用的是int 128,導(dǎo)到參數(shù)的數(shù)據(jù)類型從int 128到char *存 在不兼容,可能引起程序出故障。int str128;gets(str);warning C4022: fread : pointer mismatch for actual parameter 1直譯:調(diào)用函數(shù)fread 時,參數(shù)1的實參與指針不匹配。錯誤分析:函數(shù)fread 要求其第一參數(shù)為一指針,以下代碼將導(dǎo)致本錯誤: FILE *fp;int num; fread(num, sizeof(num), 1, fp);修改方案為:將fread所在行代碼改為:fread(&num, sizeof(num), 1, fp);warning C4018: : signed/un

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論