這篇文章主要介紹了VC++6.0編譯過程中常遇到的一些錯誤提示並給出了錯誤原因與分析,需要的朋友尅參考下
(1)error C2001: newline in constant
編號:C2001
直譯:在常量中出現了換行。
錯誤分析:
1.①字串常量、字元常量中是否有換行。
2.②在這句語句中,某個字串常量的尾部是否漏掉了雙引號。
3.③在這語句中,某個字元創常量中是否出現了雙引號字元“"”,但是沒有使用轉義符“"”。
4.④在這句語句中,某個字元常量的尾部是否漏掉了單引號。
5.⑤是否在某句語句的尾部,或語句的中間誤輸入了一個單引號或雙引號。
(2)error C2015: too many characters in constant
編號:C2015
直譯:字元常量中的字元太多了。
錯誤分析:
單引號表示字元型常量。一般的,單引號中必須有且只能有一個字元(使用轉義符時,轉義符所表示的字元當作一個字元看待),如果單引號中的字元數多於4個,就會引發這個錯誤。
另外,如果語句中某個字元常量缺少右邊的單引號,也會引發這個錯誤,例如:
if (x == 'x || x == 'y') { … }
值得注意的是,如果單引號中的字元數是2-4個,編譯不報錯,輸出結果是這幾個字母的ASC碼作為一個整數(int,4B)整體看待的數字。
(3)error C2137: empty character constant
編號:C2137
直譯:空的字元定義。
錯誤分析:
原因是連用了兩個單引號,而中間沒有任何字元,這是不允許的。
(4)error C2018: unknown character '0x##'
編號:C2018
直譯:未知字元‘0x##'。
錯誤分析:
0x##是字元ASC碼的16進位標記法。這裡說的未知字元,通常是指全形符號、字母、數字,或者直接輸入了漢字。如果全形字元和漢字用雙引號包含起來,則成為字串常量的一部分,是不會引發這個錯誤的。
(5)error C2041: illegal digit '#' for base '8'
編號:C2141
直譯:在八進位中出現了非法的數字‘#'(這個數字#通常是8或者9)。
錯誤分析:
如果某個數字常量以“0”開頭(單純的數字0除外),那麼編譯器會認為這是一個8進位數字。例如:“089”、“078”、“093”都是非法的,而“071”是合法的,等同於是進位中的“57”。
(6)error C2065: 'xxxx' : undeclared identifier
編號:C2065
直譯:標識符“xxxx”未定義。
錯誤分析:
首先,解釋一下什麼是標識符。標誌符是程式中出現的除關鍵字 之外的詞,通常由字母、數字和底線組成,不能以數字開頭,不能與關鍵字重複,並且區分大小寫。變數名、函數名、類名、常量名等等,都是標誌符。所有的標 志符都必須先定義,後使用。標誌符有很多種用途,所以錯誤也有很多種原因。
1.如果“xxxx”是一個變數名,那麼通常是程式員忘記了定義這個變數,或者拼字錯誤、大小寫錯誤所引起的,所以,首先檢查變數名是否正確。(關聯:變數,變數定義)
2.如果“xxxx”是一個函數名,那就懷疑函數名是否沒有定義。可能是拼字錯誤或大小寫錯誤,當然,也有可能是你所調用的函數根本不存在。還有一種可能,你寫的函數在你調用所在的函數之後,而你有沒有在調用之前對函數原形進行申明。(關聯:函數申明與定義,函數原型)
3. 如果“xxxx”是一個庫函數的函數名,比如“sqrt”、“fabs”,那麼看看你在cpp檔案已開始是否包含了這些庫函數所在的標頭檔(.h檔案)。 例如,使用“sqrt”函數需要標頭檔math.h。如果“xxxx”就是“cin”或“cout”,那麼一般是沒有包含“iostream.h”。(關 聯:#include,cin,cout)
4.如果“xxxx”是一個類名,那麼表示這個類沒有定義,可能性依然是:根本沒有定義這個類,或者拼字錯誤,或者大小寫錯誤,或者缺少標頭檔,或者類的使用在申明之前。(關聯:類,類定義)
5.標誌符遵循先申明後使用原則。所以,無論是變數、函數名、類名,都必須先定義,後使用。如使用在前,申明在後,就會引發這個錯誤。
6.C++的範圍也會成為引發這個錯誤的陷阱。在花括弧之內變數,是不能在這個花括弧之外使用的。類、函數、if、do(while)、for所引起的花括弧都遵循這個規則。(關聯:範圍)
7.前面某句語句的錯誤也可能導致編譯器誤認為這一句有錯。如果你前面的變數定義語句有錯誤,編譯器在後面的編譯中會認為該變數從來沒有定義過,以致後面所有使用這個變數的語句都報這個錯誤。如果函數申明語句有錯誤,那麼將會引發同樣的問題。
(7)error C2086: 'xxxx' : redefinition
編號:C2374
直譯:“xxxx”重複申明。
錯誤分析:
變數“xxxx”在同一範圍中定義了多次。檢查“xxxx”的每一次定義,只保留一個,或者更改變數名。
(8)error C2374: 'xxxx' : redefinition; multiple initialization
編號:C2374
直譯:“xxxx”重複申明,多次初始化。
錯誤分析:
變數“xxxx”在同一範圍中定義了多次,並且進行了多次初始化。檢查“xxxx”的每一次定義,只保留一個,或者更改變數名。
(9)C2143: syntax error : missing ';' before (identifier) 'xxxx'
編號:C2143
直譯:在(標誌符)“xxxx”前缺少分號。
錯誤分析:
這是VC6的編譯期最常見的誤判,當出現這個錯誤時,往往所指的語句並沒有錯誤,而是它的上一句語句發生了錯誤。其實,更合適的做法是編譯器報告在上一句語句的尾部缺少分號。上一句語句的很多種錯誤都會導致編譯器報出這個錯誤:
1.上一句語句的末尾真的缺少分號。那麼補上就可以了。
2.上一句語句不完整,或者有明顯的語法錯誤,或者根本不能算上一句語句(有時候是無意中按到鍵盤所致)。
3.如果發現發生錯誤的語句是cpp檔案的第一行語句,在本檔案中檢查沒有錯誤,但其使用雙引號包含了某個標頭檔,那麼檢查這個標頭檔,在這個標頭檔的尾部可能有錯誤。
(10)error C4716: 'xxx' : must return a value
編號:C4716
直譯:“xxx”必須返回一個值。
錯誤分析:
函式宣告了有傳回值(不為void),但函數實現中忘記了return 傳回值。要麼函數確實沒有傳回值,則修改其傳回值類型為void,要麼在函數結束前返回合適的值。
(11) warning C4508: 'main' : function should return a value; 'void' return type assumed
編號:C4508
直譯:main函數應該返回一個值;void傳回值類型被假定。
錯誤分析:
1.函數應該有傳回值,聲明函數時應指明傳回值的類型,確實無傳回值的,應將函數傳回值聲明為void。若未聲明函數傳回值的類型,則系統預設為整 型int。此處的錯誤估計是在main函數中沒有return傳回值語句,而main函數要麼沒有聲明其傳回值的類型,要麼聲明了。
2.warning類型的錯誤為警告性質的錯誤,其意思是並不一定有錯,程式仍可以被成功編譯、連結,但可能有問題、有風險。
(12)warning C4700: local variable 'xxx' used without having been initialized
編號:C4700
直譯:警告局部變數“xxx”在使用前沒有被初始化。
錯誤分析:
這是初學者常見的錯誤,例如以下程式段就 會造成這樣的警告,而且程式的確有問題,應加以修改,儘管編譯、連結可以成功——若不修改,x的值到底是多少無法確定,是隨機的,判斷其是否與3相同沒有 意義,在運氣不好的情況下,可能在偵錯工具的機器上運行時,結果看起來是對的,但更換電腦後再運行,結果就不對,初學者往往感到迷惑。
int x;
if (x==3) printf("hello");