第一篇:最常見的20種VC++編譯錯誤信息集合
1、fatal error C1010: unexpected end of file while looking for precompiled header directive。
尋找預(yù)編譯頭文件路徑時遇到了不該遇到的文件尾。(一般是沒有#include “stdafx.h”)
2、fatal error C1083: Cannot open include file: 'R??.h': No such file or directory
不能打開包含文件“R??.h”:沒有這樣的文件或目錄。
3、error C2011: 'C??': 'class' type redefinition
類“C??”重定義。
4、error C2018: unknown character '0xa3'
不認識的字符'0xa3'。(一般是漢字或中文標(biāo)點符號)
5、error C2057: expected constant expression
希望是常量表達式。(一般出現(xiàn)在switch語句的case分支中)
6、error C2065: 'IDD_MYDIALOG' : undeclared identifier
“IDD_MYDIALOG”:未聲明過的標(biāo)識符。
7、error C2082: redefinition of formal parameter 'bReset'
函數(shù)參數(shù)“bReset”在函數(shù)體中重定義。
8、error C2143: syntax error: missing ':' before '{'
句法錯誤:“{”前缺少“;”。
9、error C2146: syntax error : missing ';' before identifier 'dc'句法錯誤:在“dc”前丟了“;”。
10、error C2196: case value '69' already used
值69已經(jīng)用過。(一般出現(xiàn)在switch語句的case分支中)
11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'成員函數(shù)“OnTimer”沒有在“CHelloView”中聲明。
12、error C2511: 'reset': overloaded member function 'void(int)' not found in 'B'
重載的函數(shù)“void reset(int)”在類“B”中找不到。
13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention
類B對類A中同名函數(shù)f1的重載僅根據(jù)返回值或調(diào)用約定上的區(qū)別。
14、error C2660: 'SetTimer' : function does not take 2 parameters“SetTimer”函數(shù)不傳遞2個參數(shù)。
15、warning C4035: 'f??': no return value
“f??”的return語句沒有返回值。
16、warning C4553: '= =' : operator has no effect;did you intend '='?沒有效果的運算符“= =”;是否改為“=”?
17、warning C4700: local variable 'bReset' used without having been initialized
局部變量“bReset”沒有初始化就使用。
18、error C4716: 'CMyApp::InitInstance' : must return a value
“CMyApp::InitInstance”函數(shù)必須返回一個值。
19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing
連接錯誤:不能打開P1.exe文件,以改寫內(nèi)容。(一般是P1.Exe還在運行,未關(guān)閉)
20、error LNK2001: unresolved external symbol “public: virtual _ _thiscall C??::~C??(void)”
連接時發(fā)現(xiàn)沒有實現(xiàn)的外部符號(變量、函數(shù)等)。
function call missing argument list 調(diào)用函數(shù)的時候沒有給參數(shù)。
member function definition looks like a ctor, but name does not match enclosing class 成員函數(shù)聲明了但沒有使用
unexpected end of file while looking for precompiled header directive 在尋找預(yù)編譯頭文件時文件意外結(jié)束,編譯不正常終止可能造成這種情況
第二篇:常見錯誤信息
Keil C 編譯器常見警告與錯誤信息的解決方法
1)如果兩個或更多c文件都需要使用某非bit型變量,那么聲明是應(yīng)將相應(yīng)存儲類型同時注明,即如果定義“uchar idata cntembuf;”,那么應(yīng)聲明為“extern uchar idata cntembuf;”或者“extern idata cntembuf;”;
2)如果是bit型變量,則數(shù)據(jù)類型“bit”必須注明,而存儲類型可以省略;
LN認為,keil里之所以將bit變量和其他類型變量分開處理,是keil面向的處理器都是51內(nèi)核的,而51內(nèi)核bit變量只存在于特殊功能寄存器和內(nèi)存的位尋址區(qū)(bdata區(qū)),而特殊功能寄存器中的位變量若在兩個以上文件中使用各各文件都只能用類似于sbit abcd = P1^6;的形式進行聲明,并且keil不檢測abcd這個位變量在不同文件中是否代替相同位(例如,可以在另一個c文件中聲明為:sbit abcd = P0^5;等),這樣一來,用extern聲明的bit變量就只有在bdata區(qū)了,所以,允許在在一個c文件中定義位變量后,在其它c文件中省略“bdata”這個存儲類型;
而非bit型變量則可以在特殊功能寄存器,內(nèi)存,外存,所以聲明時要使存儲類型與定義時的存儲類型相同(也可以在定義和聲明時都不規(guī)定存儲類型,而又編譯器根據(jù)編譯模式自動分配)。
1.Warning 280:?i?:unreferenced local variable
說明局部變量i 在函數(shù)中未作任何的存取操作解決方法消除函數(shù)中i 變量的宣告Warning 206:?Music3?:missing function-prototype
說明Music3()函數(shù)未作宣告或未作外部宣告所以無法給其他函數(shù)調(diào)用
解決方法將void Music3(void)寫在程序的最前端作宣告如果是其他文件的函數(shù)則要寫成extern void Music3(void),即作外部宣告。Compling :C:8051MANN.C
Error:318:can?t open file ?beep.h?
說明在編譯C:8051MANN.C 程序過程中由于main.c 用了指令#i nclude “beep.h”,但卻找不到所致解決方法編寫一個beep.h 的包含檔并存入到c:8051 的工作目錄中Compling:C:8051LED.C
Error 237:?LedOn?:function already has a body
說明LedOn()函數(shù)名稱重復(fù)定義即有兩個以上一樣的函數(shù)名稱
解決方法修正其中的一個函數(shù)名稱使得函數(shù)名稱都是獨立的***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY
說明DelayX1ms()函數(shù)未被其它函數(shù)調(diào)用也會占用程序記憶體空間解決方法去掉DelayX1ms()函數(shù)或利用條件編譯#if …..#endif,可保留該函數(shù)并不編譯***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H
TO: 0025H
說明外部資料ROM 的0025H 重復(fù)定義地址
解決方法外部資料ROM 的定義如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 變量的名稱為0x25,請檢查是否有其它的變量名稱也是定義在0x25 處并修正它7 WARNING 206:?DelayX1ms?: missing function-prototype
C:8051INPUT.C
Error 267 :?DelayX1ms ?:requires ANSI-style prototype C:8051INPUT.C
說明程序中有調(diào)用DelayX1ms 函數(shù)但該函數(shù)沒定義即未編寫程序內(nèi)容或函數(shù)已定義但未作聲明。
解決方法:編寫DelayX1ms 的內(nèi)容,編寫完后也要作聲明或作外部聲明可在delay.h 的包含檔聲明成外部以便其它函數(shù)調(diào)用。***WARNING 1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
ADDRESS:0018H
說明程序中有調(diào)用MUSIC 函數(shù)但未將該函數(shù)的包含文檔C 加入到工程文檔Prj 作編譯和連接。
解決方法:設(shè)MUSIC3 函數(shù)在MUSIC.C 里。將MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: _DATA_GOUP_
LENGTH: 0018H
***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: VOLUME
MODULE: C:8051OSDM.OBJ(OSDM)
ADDRESS: 4036H
說明data 存儲空間的地址范圍為0~0x7f,當(dāng)公用變量數(shù)目和函數(shù)里的局部變量如果存儲模式設(shè)為SMALL 則局部變量先使用工作寄存器R2~R7 作暫存當(dāng)存儲器不夠用時則會以data 型別的空間作暫存的個數(shù)超過0x7f 時就會出現(xiàn)地址不夠的現(xiàn)象。
解決方法:將以data 型別定義的公共變量修改為idata 型別的定義說明定義了全局變量而沒有外部External聲明:reference made to erroneous externalRam空間不足:public refers to ignore segment
外部變量:定義處不用加External,聲明處要加External
將以data 型別定義的公共變量修改為idata 型別的定義*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL
定義了某某函數(shù)或全部變量在不同文件里面想調(diào)用它,卻在包含頭文件里面少了extern語句,或只有主程序和包含頭文件沒有(EXTERN......定義語句(函數(shù))).如果調(diào)試時有些if結(jié)構(gòu)里的語句符合條件沒有執(zhí)行,或者某些語句不符合條件也被執(zhí)行,那是因為if和else里有相同的語句,編譯的時候作優(yōu)化處理了。WARNING 15(MULTIPLE CALL TO SEGMENT)癥狀
我添加了一個中斷處理程序(ISR)到我的項目中,然而我卻得到了如下的警告: ***WARNING L15:MULTIPLE CALL TO SEGMENT
SEGMENT:?PR?_WRITE_GMVLX1_REG?D_GMVLX1
CALLER1:?PR?VSYNC_INTERRUPT?MAIN
CALLER2:?C_C51STARTUP
***WARNING L15:MULTIPLE CALL TO SEGMENT
SEGMENT:?PR?_SPI_SEND_WORD?D_SPI
CALLER1:?PR?VSYNC_INTERRUPT?MAIN
CALLER2:?C_C51STARTUP
***WARNING L15:MULTIPLE CALL TO SEGMENT
SEGMENT:?PR?SPI_RECEIVE_WORD?D_SPI
CALLER1:?PR?VSYNC_INTERRUPT?MAIN
CALLER2:?C_C51STARTUP
上面這些都是什么?我該如何解決這個問題呢?
原因
Warning 15向我們表明了linker發(fā)現(xiàn)了一個函數(shù),這個函數(shù)不僅在main code里被調(diào)用了,而且在ISR(或者被ISR調(diào)用的函數(shù)中)被調(diào)用了?;蛘呤潜煌瑫r被多個ISR同時調(diào)用了。這樣會產(chǎn)生一個問題,就是在此函數(shù)不是一個可重入函數(shù),而當(dāng)此函數(shù)已經(jīng)在執(zhí)行時它可能被另一個ISR所調(diào)用。這樣就會導(dǎo)致結(jié)果是可變的而且很可能會導(dǎo)致一些參數(shù)的錯誤。另一個問題就是本地變量和參數(shù)所使用的內(nèi)存可能被其他函數(shù)的內(nèi)存覆蓋。如果函數(shù)是由中斷所調(diào)用的,則此函數(shù)的內(nèi)存就會被使用。這會引起其它函數(shù)的內(nèi)存錯誤。
舉例來說,對于你的第一個警告,WRITE_GMVLX1_REG是會被多個root所調(diào)用。其被定義在D_GMVLX1.C或者D_GMVLX1.A51中。他不僅會被ISR(或者被ISR調(diào)用的函數(shù))而且也會被MAIN.C中的VSYNC_INTERRUPT函數(shù)所調(diào)用。
解決方法
有幾種方法去解決這個問題
如果你100%確認這個函數(shù)的兩個副本都不會同時執(zhí)行(如果此函數(shù)是被main調(diào)用并且中斷是未被使能的)并且此函數(shù)沒有使用內(nèi)存(只使用的寄存器),那么你就可以忽略此警告。如果此函數(shù)使用了內(nèi)存,你就要使用OVERLAY directive來將此函數(shù)從覆蓋分析(overlay anaysis)中移除。舉例如下:
OVERLAY(?PR?_WRITE_GMVLX1_REG?D_GMVLX1!*)
如上語句能阻止被此函數(shù)使用的內(nèi)存遭到覆蓋。如果這個函數(shù)調(diào)用了你程序中其他的在別處的函數(shù),那么你可能需要將這些函數(shù)也排除在覆蓋分析之外。
如果當(dāng)此函數(shù)在執(zhí)行時可以被調(diào)用,那么事情就會變得比較的復(fù)雜。你可能需要:
無論何時當(dāng)從main中調(diào)用此函數(shù)時,需要關(guān)閉中斷。你可能需要對被調(diào)用的函數(shù)使用#pragma disable。你也必須使用OVERLAY directive將此函數(shù)從overlay analysis中移除。為此函數(shù)創(chuàng)建兩個副本。一個給main,一個給ISR。
使此函數(shù)可重入。舉例如下:
void myfunc(void)reentrant {
}
上面的定義會產(chǎn)生一個用來存儲參數(shù)和本地變量的可重入的棧。如果使用了這種方法那么這個可重入的棧必須在STARTUP.A51中配置。這樣會花費更多的RAM并且會減緩可沖入函數(shù)的執(zhí)行
第三篇:中常見的一些錯誤信息
匯編中常見的一些錯誤信息
ml.exe錯誤信息:
FATAL嚴(yán)重錯誤
cannot open file不能打開文件
I/O error closing fileI/O錯誤 正在關(guān)閉文件
I/O error writing fileI/O錯誤 正在寫文件
I/O error reading fileI/O錯誤 正在讀取文件
out of memory缺少內(nèi)存
assembler limit : macro parameter name table full匯編限制:宏參數(shù)名表已滿 invalid command-line option無效命令行參數(shù)
nesting level too deep嵌套過深
unmatched macro nesting不正確的宏嵌套
line too long行太長
unmatched block nesting不正確的區(qū)、段嵌套
directive must be in control block指令必須在控制段
error count exceeds 100;stopping assembly錯誤數(shù)超過100,停止匯編 invalid numerical command-line argument無效命令行參數(shù)
too many arguments太多參數(shù)、定義、沖突
statement too complex聲明太復(fù)雜
Internal Assembler Error內(nèi)部匯編錯誤
missing source filename找不到源文件名
COFF error writing fileCOFF錯誤,正在寫文件
invalid debug and browser data;file exceeds line limit不能排除故障和瀏覽數(shù)據(jù);文件超過行限制
cannot find link.exe找不到連接程序
cannot find cvpack.exe找不到cvpack.exe
SEVERE嚴(yán)重的錯誤
memory operand not allowed in context內(nèi)存操作數(shù)無法載入上下文環(huán)境 immediate operand not allowed當(dāng)前操作數(shù)無法載入
cannot have more than one ELSE clause per IF blockIF段只能有一個ELSE從句 extra characters after statement附加的字符在聲明之后
symbol type conflict符號類型沖突
symbol redefinition符號已經(jīng)定義
undefined symbol符號沒有定義
non-benign record redefinition沒有利于記錄的定義
syntax error語法錯誤
syntax error in expression表達式存在語法錯誤
invalid type expression無效的類型表達式
distance invalid for word size of current segment當(dāng)前區(qū)、段的大小命令無效
PROC, MACRO, or macro repeat directive must precede LOCALPROC, MACRO, 或 macro repeat指令必須在LOCAL之前
.MODEL must precede this directive.MODEL必須在指令之前
cannot define as public or external不能定義為公有或外部的segment attributes cannot change區(qū)、段屬性不能更換
expression expected預(yù)期表達式
operator expected預(yù)期操作數(shù)
invalid use of external symbol使用了無效的外部符號
operand must be RECORD type or field操作數(shù)必須是RECORD類型或域
identifier not a record沒有記錄標(biāo)示符
record constants may not span line breaks連續(xù)記錄不能超過行間隔
instruction operands must be the same size命令操作數(shù)必須是一樣的長度
instruction operand must have size命令操作數(shù)必須有長度
invalid operand size for instruction操作數(shù)長度對于指令無效
operands must be in same segment操作數(shù)必須在相同的段
constant expected連續(xù)預(yù)期
operand must be a memory expression操作數(shù)必須是一個內(nèi)存表達式
expression must be a code address表達式必須是一個代碼地址
multiple base registers not allowed不允許多重基礎(chǔ)寄存器
multiple index registers not allowed不允許多重標(biāo)志寄存器
must be index or base register必須是基礎(chǔ)或標(biāo)志寄存器
invalid use of register使用的寄存器無效
invalid INVOKE argument無效的INVOKE符號
must be in segment block必須在區(qū)、段、塊中
DUP too complexDUP太復(fù)雜
too many initial values for structure太多結(jié)構(gòu)的基礎(chǔ)資料
statement not allowed inside structure definition聲明不允許在結(jié)構(gòu)里面
missing operand for macro operator找不到宏的操作數(shù)
line too long
segment register not allowed in context上下文不允許有寄存器
string or text literal too long文本或字符串太長
statement too complex聲明太復(fù)雜
identifier too long標(biāo)識符太長
invalid character in file文件里有無效字符
missing angle bracket or brace in literal語句里找不到同樣的括弧或框架
missing single or double quotation mark in string找不到單引號或雙引號
empty(null)string沒有字符串
nondigit in number沒有總數(shù)
syntax error in floating-point constant不確定的指向中有語法錯誤
real or BCD number not allowed不允許real或BCD編碼
text item required必須的文本項
forced error強制錯誤
forced error : value equal to 0標(biāo)準(zhǔn)等于零
forced error : value not equal to 0標(biāo)準(zhǔn)不等于零
forced error : symbol not defined符號沒有定義
forced error : symbol defined符號已定義
forced error : string blank字符串是空的forced error : string not blank字符串不是空的forced error : strings equal字符串是相同的forced error : strings not equal字符串不是相同的[ELSE]IF2/.ERR2 not allowed : single-pass assembler[ELSE]IF2/.ERR2不允許單獨匯編 expression too complex for.UNTILCXZ.UNTILCXZ表達式太復(fù)雜
can ALIGN only to power of 2僅能對齊到2的冪
structure alignment must be 1, 2, 4, 8, or 16結(jié)構(gòu)對齊必須是1,2,4,8或16 expected預(yù)定義
incompatible CPU mode and segment size不匹配的CPU模式和段尺寸
LOCK must be followed by a memory operationLOCK指令必須跟在內(nèi)存操作之后 instruction prefix not allowed不允許的命令前綴
no operands allowed for this instruction指令沒有操作數(shù)
invalid instruction operands無效的指令操作數(shù)
initializer magnitude too large for specified size初始指定尺寸太大
cannot access symbol in given segment or group在特定的段或類不能存取符號
operands have different frames操作數(shù)存在不同的結(jié)構(gòu)
cannot access label through segment registers在段寄存器中不能存取標(biāo)記
jump destination too far跳轉(zhuǎn)目標(biāo)太遠
jump destination must specify a label跳轉(zhuǎn)目標(biāo)必須指定一個標(biāo)記
instruction does not allow NEAR indirect addressing指令不允許近間接尋址
instruction does not allow FAR indirect addressing指令不允許遠間接尋址
instruction does not allow FAR direct addressing指令不允許遠直接尋址
jump distance not possible in current CPU mode跳轉(zhuǎn)距離不適合當(dāng)前CPU模式
missing operand after unary operator一元運算符之后找不到操作數(shù)
cannot mix 16-and 32-bit registers不能結(jié)合16位和32位寄存器
invalid scale value無效范圍標(biāo)準(zhǔn)
constant value too large連續(xù)標(biāo)準(zhǔn)太多
instruction or register not accepted in current CPU mode當(dāng)前CPU模式不認可的指令或寄存器 reserved word expected預(yù)期的保留字
instruction form requires 80386/486指令需要80386/486指示
END directive required at end of fileEND指令必須在文件結(jié)尾
too many bits in RECORD太多位在記錄里
positive value expected預(yù)期的明確的標(biāo)準(zhǔn)
index value past end of string索引標(biāo)準(zhǔn)在字符串結(jié)尾之后
count must be positive or zero計數(shù)必須是零或明確的count value too large計數(shù)標(biāo)準(zhǔn)太多
operand must be relocatable操作數(shù)必須是轉(zhuǎn)移表
constant or relocatable label expected預(yù)期的轉(zhuǎn)移表或連續(xù)的segment, group, or segment register expected預(yù)期的段,類型或段寄存器 segment expected預(yù)期的區(qū)段
invalid operand for OFFSETOFFSET操作數(shù)無效
invalid use of external absolute由于完全外部的使用無效
segment or group not allowed區(qū)段或類型不允許
cannot add two relocatable labels不能增加雙重轉(zhuǎn)移表標(biāo)記
cannot add memory expression and code label不能增加內(nèi)存表達式和代碼標(biāo)記
第四篇:Visual_C++_6.0常見語法錯誤信息
Visual C++ 6.0常見的語法錯誤信息
1、error C2018: unknown character '0xa1'
不認識的字符'0xa1'。(一般是漢字或中文標(biāo)點符號)
2、error C2065: 'I??' : undeclared identifier“I??”:未聲明過的標(biāo)識符。
3、error C2146: syntax error : missing ';'
語法錯誤:丟了“;”。
4、error C2146: syntax error : missing ')'
語法錯誤:丟了“)”。
5、fatal error C1004: unexpected end of file found 語法錯誤:丟了“}”。
6、error C2057: expected constant expression
希望是常量表達式。(一般出現(xiàn)在switch語句的case分支中)
7、error C2196: case value 'xx' already used
值xx已經(jīng)用過。(一般出現(xiàn)在switch語句的case分支中)
8、error C2181: illegal else without matching if語法錯誤:if缺少判斷表達式。
第五篇:VC6.0編譯常見錯誤的詳解及其錯誤分析(范文)
VC6.0編譯常見錯誤
第一部分 編譯錯誤
1. error C2001: newline in constant
編號:C2001
直譯:在常量中出現(xiàn)了換行。
錯誤分析:
(1)字符串常量、字符常量中是否有換行。
(2)在這句語句中,某個字符串常量的尾部是否漏掉了雙引號。
(3)在這語句中,某個字符創(chuàng)常量中是否出現(xiàn)了雙引號字符““”,但是沒有使用轉(zhuǎn)
義符“””。
(4)在這句語句中,某個字符常量的尾部是否漏掉了單引號。
(5)是否在某句語句的尾部,或語句的中間誤輸入了一個單引號或雙引號。
2. error C2015: too many characters in constant
編號:C2015
直譯:字符常量中的字符太多了。
錯誤分析:
單引號表示字符型常量。一般的,單引號中必須有,也只能有一個字符(使用轉(zhuǎn)義符時,轉(zhuǎn)義符所表示的字符當(dāng)作一個字符看待),如果單引號中的字符數(shù)多于4個,就會引發(fā)這個錯誤。
另外,如果語句中某個字符常量缺少右邊的單引號,也會引發(fā)這個錯誤,例如: if(x == 'x || x == 'y'){ … }
值得注意的是,如果單引號中的字符數(shù)是2-4個,編譯不報錯,輸出結(jié)果是這幾個字母的ASC碼作為一個整數(shù)(int,4B)整體看待的數(shù)字。
兩個單引號之間不加任何內(nèi)容會引發(fā)如下錯誤:error C2137: empty character
constant。
3. error C2018: unknown character '0x##'
編號:C2018
直譯:未知字符‘0x##’。
錯誤分析:
0x##是字符ASC碼的16進制表示法。這里說的未知字符,通常是指全角符號、字母、數(shù)字,或者直接輸入了漢字。如果全角字符和漢字用雙引號包含起來,則成為字符串常量的一部分,是不會引發(fā)這個錯誤的。
4. error C2041: illegal digit '#' for base '8'
編號:C2141
直譯:在八進制中出現(xiàn)了非法的數(shù)字‘#’(這個數(shù)字#通常是8或者9)。
錯誤分析:
如果某個數(shù)字常量以“0”開頭(單純的數(shù)字0除外),那么編譯器會認為這是一個
8進制數(shù)字。例如:“089”、“078”、“093”都是非法的,而“071”是合法的,等同于是進制中的“57”。
5. error C2065: 'xxxx' : undeclared identifier
編號:C2065
直譯:標(biāo)識符“xxxx”未定義。
錯誤分析:
首先,解釋一下什么是標(biāo)識符。標(biāo)志符是程序中出現(xiàn)的除關(guān)鍵字之外的詞,通常由字母、數(shù)字和下劃線組成,不能以數(shù)字開頭,不能與關(guān)鍵字重復(fù),并且區(qū)分大小寫。變量名、函數(shù)名、類名、常量名等等,都是標(biāo)志符。所有的標(biāo)志符都必須先定義,后使用。標(biāo)志符有很多種用途,所以錯誤也有很多種原因。
(1)如果“xxxx”是一個變量名,那么通常是程序員忘記了定義這個變量,或者拼寫
錯誤、大小寫錯誤所引起的,所以,首先檢查變量名是否正確。(關(guān)聯(lián):變量,變量定義)
(2)如果“xxxx”是一個函數(shù)名,那就懷疑函數(shù)名是否沒有定義。可能是拼寫錯誤或
大小寫錯誤,當(dāng)然,也有可能是你所調(diào)用的函數(shù)根本不存在。還有一種可能,你寫的函數(shù)在你調(diào)用所在的函數(shù)之后,而你有沒有在調(diào)用之前對函數(shù)原形進行
申明。(關(guān)聯(lián):函數(shù)申明與定義,函數(shù)原型)
(3)如果“xxxx”是一個庫函數(shù)的函數(shù)名,比如“sqrt”、“fabs”,那么看看你在cpp
文件已開始是否包含了這些庫函數(shù)所在的頭文件(.h文件)。例如,使用“sqrt”函數(shù)需要頭文件math.h。如果“xxxx”就是“cin”或“cout”,那么一般是沒有包含“iostream.h”。(關(guān)聯(lián):#include,cin,cout)
(4)如果“xxxx”是一個類名,那么表示這個類沒有定義,可能性依然是:根本沒有
定義這個類,或者拼寫錯誤,或者大小寫錯誤,或者缺少頭文件,或者類的使
用在申明之前。(關(guān)聯(lián):類,類定義)
(5)標(biāo)志符遵循先申明后使用原則。所以,無論是變量、函數(shù)名、類名,都必須先
定義,后使用。如使用在前,申明在后,就會引發(fā)這個錯誤。
(6)C++的作用域也會成為引發(fā)這個錯誤的陷阱。在花括號之內(nèi)變量,是不能在這個
花括號之外使用的。類、函數(shù)、if、do(while)、for所引起的花括號都遵循這個規(guī)則。(關(guān)聯(lián):作用域)
(7)前面某句語句的錯誤也可能導(dǎo)致編譯器誤認為這一句有錯。如果你前面的變量
定義語句有錯誤,編譯器在后面的編譯中會認為該變量從來沒有定義過,以致
后面所有使用這個變量的語句都報這個錯誤。如果函數(shù)申明語句有錯誤,那么
將會引發(fā)同樣的問題。
6. error C2086: 'xxxx' : redefinition
編號:C2374
直譯:“xxxx”重復(fù)申明。
錯誤分析:
變量“xxxx”在同一作用域中定義了多次。檢查“xxxx”的每一次定義,只保留一個,或者更改變量名。
7. error C2374: 'xxxx' : redefinition;multiple initialization
編號:C237
4直譯:“xxxx”重復(fù)申明,多次初始化。
錯誤分析:
變量“xxxx”在同一作用域中定義了多次,并且進行了多次初始化。檢查“xxxx”的每一次定義,只保留一個,或者更改變量名。
8. C2143: syntax error : missing ';' before(identifier)'xxxx'
編號:C2143
直譯:在(標(biāo)志符)“xxxx”前缺少分號。
錯誤分析:
這是VC6的編譯期最常見的誤報,當(dāng)出現(xiàn)這個錯誤時,往往所指的語句并沒有錯誤,而是它的上一句語句發(fā)生了錯誤。其實,更合適的做法是編譯器報告在上一句語句的尾部缺少分號。上一句語句的很多種錯誤都會導(dǎo)致編譯器報出這個錯誤:
(1)上一句語句的末尾真的缺少分號。那么補上就可以了。
(2)上一句語句不完整,或者有明顯的語法錯誤,或者根本不能算上一句語句(有
時候是無意中按到鍵盤所致)。
(3)如果發(fā)現(xiàn)發(fā)生錯誤的語句是cpp文件的第一行語句,在本文件中檢查沒有錯誤,而且這個文件使用雙引號包含了某個頭文件,那么檢查這個頭文件,在這個頭
文件的尾部可能有錯誤。
9. error C2137: empty character constant
編號:C2137
直譯:空的字符定義。
錯誤分析:
原因是連用了兩個單引號,而中間沒有任何字符。一般的,單引號表示字符型常量,單引號中必須有,也只能有一個字符(使用轉(zhuǎn)義符時,轉(zhuǎn)義符所表示的字符當(dāng)作一個字符看待)。兩個單引號之間不加任何內(nèi)容是不允許的。
需要注意的是:如果單引號中的字符數(shù)是2-4個,編譯不報錯,輸出結(jié)果是這幾個字母的ASC碼作為一個整數(shù)(int,4B)整體看待的數(shù)字。
如果單引號中的字符數(shù)多于4個,會引發(fā)2015錯誤:error C2015: too many characters in constant。
10. error C2374: 'xxxx' : redefinition;multiple initialization
編號:C2374
直譯:“xxxx”重復(fù)申明,多次初始化。
錯誤分析:
變量“xxxx”在同一作用域中定義了多次,并且進行了多次初始化。檢查“xxxx”的每一次定義,只保留一個,或者更改變量名。
第二部分 鏈接錯誤
1. error LNK2001: unresolved external symbol _main
編號:LNK2001
直譯:未解決的外部符號:_main。
錯誤分析:缺少main函數(shù)。看看main的拼寫或大小寫是否正確。
2. error LNK2005: _main already defined in xxxx.obj
編號:LNK2005
直譯:_main已經(jīng)存在于xxxx.obj中了。
錯誤分析:
直接的原因是該程序中有多個(不止一個)main函數(shù)。這是初學(xué)C++的低年級同學(xué)在初次編程時經(jīng)常犯的錯誤。這個錯誤通常不是你在同一個文件中包含有兩個main函數(shù),而是在一個project(項目)中包含了多個cpp文件,而每個cpp文件中都有一個main函數(shù)。引發(fā)這個錯誤的過程一般是這樣的:你寫完成了一個C++程序的調(diào)試,接著你準(zhǔn)備寫第二個C++文件,于是你可能通過右上角的關(guān)閉按鈕關(guān)閉了當(dāng)前的cpp文件字窗口(或者沒有關(guān)閉,這一操作不影響最后的結(jié)果),然后通過菜單或工具欄創(chuàng)建了一個新的cpp文件,在這個新窗口中,程序編寫完成,編譯,然后就發(fā)生了以上的錯誤。原因是這樣的:你在創(chuàng)建第二個cpp文件時,沒有關(guān)閉原來的項目,所以你無意中新的cpp文件加入你上一個程序所在的項目。切換到“File View”視圖,展開“Source Files”節(jié)點,你就會發(fā)現(xiàn)有兩個文件。
在編寫C++程序時,一定要理解什么是Workspace、什么是Project。每一個程序都是一個Project(項目),一個Project可以編譯為一個應(yīng)用程序(*.exe),或者一個動態(tài)鏈接庫(*.dll)。通常,每個Project下面可以包含多個.cpp文件,.h文件,以及其他資源文件。在這些文件中,只能有一個main函數(shù)。初學(xué)者在寫簡單程序時,一個Project中往往只會有一個cpp文件。Workspace(工作區(qū))是Project的集合。在調(diào)試復(fù)雜的程序時,一個Workspace可能包含多個Project,但對于初學(xué)者的簡單的程序,一個Workspace往往只包含一個Project。
當(dāng)完成一個程序以后,寫另一個程序之前,一定要在“File”菜單中選擇“Close Workspace”項,已完全關(guān)閉前一個項目,才能進行下一個項目。避免這個錯誤的另一個方法是每次寫完一個C++程序,都把VC6徹底關(guān)掉,然后重寫打開VC6,寫下一個程序。