編譯時期提示的錯誤有哪些
『壹』 出現中文符號時,編譯錯誤信息顯示什麼
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打開APP
System_sleep
關注
VS2019代碼中包含中文內容導致的編譯錯誤和列印輸出亂碼問題 原創
2022-06-25 17:45:47
2點贊
System_sleep
碼齡11年
關注
前言
在VS2019中,如果代碼中包含中文字元串定義或注釋,會導致各種莫名其妙的編譯錯誤,就算是運氣好,編譯沒有報錯,也會遇到控制台列印中文亂碼的問題,讓人倍感煩躁。
編譯問題
1. 代碼中定義了中文字元串常量導致編譯錯誤:「常量中有換行符「 ;
2. 代碼中包含中文注釋導致編譯錯誤:找不到XXX (宏、變數)、XXX不是常量/變數及由於找不到聲明導致的其他問題;
列印亂碼問題
代碼列印中文字元串,在命令提示符輸出是亂碼;
解決方法,三種方法任選其一:
一. 修改代碼文件格式為utf-8帶簽名,讓MSVC編譯器能夠自動識別並以utf-8 BOM格式載入文件:
使用外部編輯器將代碼文件保存為utf8-BOM格式;
或 打開代碼文件,在VS2019 「高級保存選項」 中將代碼文件保存格式選擇為「Unicode-帶簽名「;
二. 修改代碼格式:
修改中文字元串、中文注釋的格式,在中文結尾處添加英文空格,讓MSVC編譯器能夠以GBK編碼方式載入編譯中文utf-8編碼字元串,可以解決編譯報錯問題,列印還是亂碼;
三. 強制指定MSVC編譯器載入代碼文件的編碼格式:
在VS2019「項目」-「工程屬性」對話框-「C/C++」-「所有選項"子頁,在「附加選項」內添加 「/utf-8」 (等同於」/source-charset:utf-8 /execution-charset:utf-8");
在VS2019「項目」-「工程屬性」對話框-「C/C++」-"所有選項"子頁,在「附加選項」內添加 「/source-charset:utf-8 /execution-charset:gbk」 (前者表示文件本身的編碼,後者表示編譯以後的字元數組內的位元組是什麼編碼);
總結:
1. 如果是新建工程,推薦方法一,讓所有新建代碼文件都統一為utf-8 BOM 格式;
2. 如果是跨平台代碼,且文件包含少量中文注釋,可以嘗試方法二;
3. 如果是已有的歷史復雜工程(非使用工具導出的解決方案),可以嘗試方法三, 但需要注意設置execution-charset時,要同時考慮到UI顯示和列印二者對字元串編碼的要求(可能不一致);
一、基礎知識和數據類型、表達式 1、{},[],(),『』,「」不配對。解決這個問題最好的方法就是每當寫這些符號的時候就先寫成一對,然後再在中間加內容。 2、忘記在語句的末尾加分號,或在預處理命令後多加分號。記住:每一個語句的後邊都要加分號,而預處理命令並不是語句,所以不加分號,他們必須每行一條,不能把多個命令寫在一行。 3、混淆/和\;注釋對應的符號是/* */,而轉義字元是以\開頭,除號是/。 4、printf()和scanf()的參數設置有誤,主要表現在以下幾方面: l 類型不匹配的問題。(例如:有float a=3.5,但輸出的時候printf(「a=%d」,a);則屏幕上會顯示出a=0.00000或者提示其它運行錯誤)。基本原則是:float對應%f, int對應%d, char對應%c。 l 個數不匹配。無論是哪個函數,都可以有n個參數,第一個永遠是「」括起來的內容,表示輸出格式。剩下的n-1個是輸出的變數或者輸入的變數的地址。需要注意的是,如果後邊有n-1個參數,那麼前邊一定對應n-1個%f一類的格式說明符。 l scanf()中變數前忘了加&。記住:scanf()中變數前要有&(但後邊學到的字元數組名和指針前不用加) 5、定義標識符的時候經常出現使用非法字元的情況,例如:標識符中不能用空格,也就是說不能有這樣的定義:int radium of circle;一般情況下可用下劃線將三個單詞連接在一起。 6、在使用變數前未定義,或未初始化。例如:若下邊的sum未定義,則在編譯時會提示相應的錯誤信息,而若未初始化為0,則求和的結果一定是錯誤的。 void main() { int I,a[10], sum=0; /*只要下邊要用,這個定義就必須要有,一般情況下也要有初始值*/ for(I=0;I<10;I++) sum+=a[I]; printf(「%d」,sum); } 7、計算錯誤。主要注意:++,――和其它運算符一起運算時,除根據優先順序進行計算時,還要考慮先後位置的特殊含義;數據類型不一致時發生的自動轉換也會導致計算的誤差;還要注意求模結果的符號與被除數相同;某些特殊情況下 使用懶惰求值法。 8、不能除以0,要做合法性檢查; 9、類型溢出。記住每種數據類型的取值范圍,確保數據在所定義類型範圍之內; 10、數學表達式的格式有誤。常見的有:(1)數學與C語言運算表達式的混淆(例如:=表示賦值,而= =才表示我們數學中的相等關系)。(2)、忽略了運算的優先順序。解決這個問題的最好方法就是寫數學表達式時不要從左到右,而是按優先順序的順序寫,寫完優先順序高的一個表達式後加上()再寫下一級的表達式,例如:計算梯形的面積時,要s=((a+b)*h)/2,不要1/2*a+b*h. (3)忽略了計算和賦值時的自動轉換。例如:float half=1/2;這樣,因為=右邊是整數相除的結果為整數0,不會得到0.5存入half,進而會影響下邊的計算結果。要想不在這兒絆跟頭,當計算不同類型的數據時,一定注意會不會出現引起錯誤的自動轉換,建議最好加上強制轉換。(4)賦值號左邊不是變數,例如:若有#define PI 3.14,程序中又出現PI=3.14159。又例如:f(n)=f(n-1)*n(這是典型的數學語言,在C語言中右邊的乘積不能正確存儲,而左邊又是一個函數調用)。 11、使用庫函數前忘了加#include<?.h> 二、流程式控制制 1、 丟掉語句結束標記「;」,尤其是for語句中表達式後或do-while語句後的分號,或在預處理命令後邊、while()後、for()後加「;」; 2、 If語句或循環語句中邏輯表達式或關系表達式書寫錯誤。一定要注意C語言的條件與數學表達式的區別(例如我們數學中經常寫到的0≤x≤9,在C語言中應該寫成x>=0&&x<=9)。 3、 if-else嵌套時不配對。最好在寫每個條件時要用兩個{}分別將兩個分支先括起來,再添加其中的語句,以保證其配對不易錯。 4、 switch()語句中的格式不正確。()中的表達式結果一定是一些明確的值,不能是區間;表達式的所有可能結果要列在case後邊,case與常量之間有一空格,不要丟掉必要的break; 5、 隨意修改循環控制變數i的值,導致循環次數的改變,尤其是當循環有嵌套時。在循環體中,不要將循環控制變數進行另外的改變。 6、 分不清什麼情況下用雙重循環,什麼情況下用兩個控制變數寫成一重循環。當I不變,j又循環一遍的時候用雙重循環。當I,j同時變化的時候用一重循環,此時,循環控制變數有兩個,但條件只寫一個就可以,因為另一個總是進行相應的變化的。 7、 忽略循環體與循環控制變數的關系。其實,很多情況下,循環控制變數都在循環體中起到非常重要的作用。應該利用上這種關系。 三、數組與指針 1、 字元串的輸入有錯誤:主要表現在使用scanf()或gets()時加了&,或輸入字元串時用循環,(這樣的話,字元個數無論多長,都不會為自動加\0,將來引用的時候也就不能以字元串的形式引用。) 2、 對字元串的處理中,循環條件仍然寫成I<N。由於字元串是不定長的,所以循環條件一般為str[I]!=』\0』 或I<strlen(str) 3、 而輸入所對應的變數是指針時(常見的有:輸入的變數是字元數組名或指向字元串的指針)不能加&。 4、 指針定義後未賦值就引用。如果在定義時不知道賦什麼值,可以用p=NULL賦初值,以避免引起的災難性錯誤。 5、 分不清p和*p。前者是指針,即地址,後者表示指針所間接引用的數據,但如果是二級指針或多級指針,取*以後得到的仍然可能是地址。 四、函數 1、 函數定義的時候,函數頭部加分號,而函數聲明的地方忘了加分號 2、 函數實參格式不對,主要表現在:給出實參時,多給出數組類型,或者,形參是數組int a[];的時候,給出的a[]或a[I]. 3、 遞歸時忘了設置邊界條件,這樣易造成死循環調用。 4、使用函數之前未聲明(包括C庫函數的聲明)。建議大家,將所定義的一切函數都在程序開始的預處理命令後加上函數原型的聲明,這樣做不僅可以避免錯誤,而且整個程序的結構看起來更清楚。 五、結構體共用體 1、 結構體類型定義有誤,主要表現在:結構體類型里還有嵌套的時候,忘記了成員名稱。(例如:下邊的例子中,有些同學經常忽略了birthday) 2、 結構體類型名和結構體變數名混淆。例如: struct STU {…. Struct data {int year,month,day; }birthday }; struct STU a; struct STU是類型名稱,而且不分配空間,且不能直接引用。只有定義了結構體類型struct STU的變數a以後,才為a分配相應的內存空間,引用時也要是a.??? 3、 結構體變數的成員引用不正確,尤其是當結構體類型中有嵌套定義的時候。一定要一級一級的引用。例如:上邊的例子:如果引用其中的年的話,一定是a.birthday.year. 不能直接a.year. 4、 對結構體變數進行輸入輸出的時候,整體輸入或整體輸出。除作為函數參數外,不能對結構體變數整體操作,只能一個成員一個成員地輸入、輸出。 5、 不理解共用體的「共占內存」。對共用體中的成員變數,一定要靠一個標記區別它們,並分別按不同類型引用它們。切記:共用體變數不能做函數形參。 六、文件 1、 使用之前沒有打開文件,使用之後沒有關閉文件。 2、 相關函數的調用格式有誤。請一定注意實參的類型、順序、個數上與函數原型(或函數聲明)的一致。
『叄』 Quartus II編譯時出現錯誤
第一條是沒有找到所需要的初始化文件或者已經編譯生成的hex文件,如果有其他編譯軟體的話,請在編譯時,生成hex文件前打鉤
第二條也許是always的敏感變數出現問題,沒有給出程序一時無法解決
一共兩條錯誤,後面的是warning,可以不予理睬
『肆』 程序編譯時產生錯誤是因為程序中有語法錯誤.
正確
運行時錯誤會在程序運行的過程中出現,比如,在運行的過程中內存被耗盡,引用了不該被引用的地址,除數為0等
邏輯錯誤是程序運行一切正常,但是沒有得到程序作者希望得到的結果,比如,本來應該是加法,卻寫成了減號,這樣程序依然可以正常運行,但是不會按照設想得到和,而是會計算出差。
『伍』 c語言源程序在編譯,鏈接,運行時,可能發生的錯誤類型有哪些
剛畢業時也是很迷茫,但是我很幸運的是我遇到了我的幸福之星,他是一個非常牛的人。其實C和C++是一個想學編程的最好的入門語言。但是如果你要走這條路的話那你可要准備做好受打擊了心裡准備了,因為這兩門語言的確是很難的,要學的的話你至少要學四到五年才能去做一些東西。它倆都是和底層打交道的,所以要考慮計算機硬體的一些東西。除此之外你還要懂好多的,不過任何事都一樣難學肯定是學出山也很牛了,是這樣的你可以看看美國微軟的程序員不就是搞底層開發的嗎?當然對這兩門語言你做到這樣就可以了。對C你只要把譚浩強《C程序設計》上的每一道題練的很熟就可以了,一定要記得只有你自己編出來才是你的,看懂的永遠也不是你的。對於C++它不是練你的編程的邏輯思維的,而是讓你有一個面向對象的思想。你要做的是不停的去思考。還有等你學完之後,可試著朝「B/S模式」開發應用發展。當然這只是我的意見。我覺的咱現在還是以掙錢為主,其他的以後再說了,你覺的呢。最後祝你學業有成!好了就給你說到此了。有問題網路見!
『陸』 關於C語言在編譯時常出現的錯誤有哪些
1、fatal error C1010: unexpected end of file while looking for precompiled header directive。
尋找預編譯頭文件路徑時遇到了不該遇到的文件尾。(一般是沒有#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'。(一般是漢字或中文標點符號)
5、error C2057: expected constant expression
希望是常量表達式。(一般出現在switch語句的case分支中)
6、error C2065: 'IDD_MYDIALOG' : undeclared identifier
「IDD_MYDIALOG」:未聲明過的標識符。
7、error C2082: redefinition of formal parameter 'bReset'
函數參數「bReset」在函數體中重定義。
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已經用過。(一般出現在switch語句的case分支中)
11、error C2509: 'OnTimer' : member function not declared in 'CHelloView'
成員函數「OnTimer」沒有在「CHelloView」中聲明。
12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B'
重載的函數「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中同名函數f1的重載僅根據返回值或調用約定上的區別。
14、error C2660: 'SetTimer' : function does not take 2 parameters
「SetTimer」函數不傳遞2個參數。
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」函數必須返回一個值。
19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing
連接錯誤:不能打開P1.exe文件,以改寫內容。(一般是P1.Exe還在運行,未關閉)
20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"
連接時發現沒有實現的外部符號(變數、函數等)。
function call missing argument list 調用函數的時候沒有給參數。
member function definition looks like a ctor, but name does not match enclosing class 成員函數聲明了但沒有使用
unexpected end of file while looking for precompiled header directive 在尋找預編譯頭文件時文件意外結束,編譯不正常終止可能造成這種情況
『柒』 java編譯器會出現的錯誤提示有哪些
錯誤就是error,它不同於異常。有時候程序不發生異常是不會出問題的,但有錯誤一定有問題。
常見的錯誤:編寫錯誤,語句錯誤---這兩個編譯器會提醒,也就是常用的eclipse;
邏輯錯誤,這個要看你自己的邏輯思維了。
潛在錯誤,也就是編寫語句邏輯都沒有問題,但jvm檢測有問題,就需要你自己找了,通常潛在錯誤都有邏輯問題。
『捌』 C++編譯時出錯
在類的申明的時候,需要加上分號
class Clock
{
public:
void setTime(int h=0,int m=0,int s=0);
void showTime();
void showTime(int n);
private:
int hour;
int minute;
int second;
};
還有#include<Clock.cpp>改成#include<Clock.h>
『玖』 C語言編程時 都有什麼樣的錯誤提示
Ambiguous operators need parentheses
不明確的運算,需要用括弧括起來
Ambiguous symbol 'xxx'
不明確的符號
Argument list syntax error
參數表語法錯誤
Array bounds missing
丟失數組界限符
Array size too large
數組尺寸太大
Bad character in parameters
參數中有不適當的字元
Bad file name format in include directive
包含命令中文件名格式不正確
Bad ifdef directive syntax
編譯預處理ifdef有語法錯誤
Bad ifndef directive syntax
編譯預處理ifndef有語法錯誤
Bad undef directive syntax
編譯預處理undef有語法錯誤
Call of non-function
調用未定義的函數
Call to function with no prototype
調用函數時沒有函數的說明
Cannot modify a const object
不允許修改常量對象
Case outside of switch
Case 出現在 switch 之外
Case statement missing
漏掉了 Case 語句
Case syntax error
Case 語法錯誤
Case outside of switch
Case 出現在 switch 之外
Case statement missing
漏掉了 Case 語句
Case syntax error
Case 語法錯誤
Code has no effect
代碼不可能執行到
Compound statement missing }
復合語句漏掉了"}"
Conflicting type modifiers
不明確的類型說明符
Constant expression required
要求常量表達式
Constant out of range in comparison
在比較中常量超出范圍
Conversion may lose significant digits
轉換時會掉失有意義的數字
Conversion of near pointer not allowed
不允許轉換返指針
Could not find file 'xxx'
找不到xxx文件
Declaration missing ;
說明缺少分號";"
Declaration syntax error
說明中出現語法錯誤
Default outside of switch
default出現在switch語句之外
Define directive needs an identifier
定義編譯預處理需要標識符
Division by zero
用零作除數
Do statement must have while
do-while語句中缺少while部分
Enum syntax error
枚舉類型語法錯誤
Enumeration constant syntax error
枚舉常數語法錯誤
Error directive: xxx
錯誤的編譯預處理命令
Error writing output file
寫輸出文件錯誤
Expression syntax error
表達式語法錯誤
Extra parameter in call
調用時出現多餘錯誤
File name too long
文件名太長
Function call missing )
函數調用缺少右括弧
Function definition out of place
函數定義位置錯誤
Function should return a value
函數返回一個值
Goto statement missing label
goto 語句沒有標號
Hexadecimal or octal constant too large
16進制或8進制常數太大
Illegal character 'x'
非法字 x
Illegal initialization
非法的初始化
Illegal octal digit
非法的8進制數字
Illegal pointer subtraction
非法的指針相減
Illegal structure operation
非法的結構體操作
Illegal use of pointer
指針使用非法
Improper use of a typedef symbol
類型符號定義使用不恰當
In-line assembly not allowed
不允許使用行間匯編
Incompatible storage class
存儲類別不相容
Incompatible type conversion
不相容的類型轉換
Incorrect number format
錯誤的數據格式
Incorrect use of default
default使用不正確
Invalid indirection
無效的間接運算
Invalid pointer addition
指針相加無效
Irrecible expression tree
無法執行的表達式運算
Lvalur required
需要邏輯值(0或非0值)
Macro argument syntax error
宏參數語法錯誤
Macro expansion too long
宏的擴展以後太長
Mismatched number of parameters in definition
定義中參數個數不匹配
Misplaced break
此處不應出現break語句
Misplaced continue
此處不應出現continue語句
Misplaced decimal point
此處不應出現小數點
Misplaced elif directive
此處不應出現編譯預處理elif
Misplaced else
此處不應出現else
Misplaced else directive
此處不應出現編譯預處理 else
Misplaced endif directive
此處不應出現編譯預處理 endif
Must be addressable
必須是可以編址的
Must take address of memory location
必須存儲定位的地址
No declaration for function 'xxx'
沒有函數 xxx 的說明
No stack
缺少堆棧
No type information
沒有類型信息
Non-portable pointer assignment
不可移動的指針(地址常數)賦值
Non-portable pointer comparison
不可移動的指針(地址常數)比較
Non-portable pointer conversion
不可移動的指針(地址常數)轉換
Not a valid expression format type
不合法的表達式格式
Not an allowed type
不允許使用的類型
Numeric constant too large
數值常數太大
Out of memory
內存不夠用
Parameter 'xxx' is never used
參數 xxx 沒有用到
Pointer required on left side of ->
-> 符號的左邊必須是指針
Possible use of 'xxx' before definition
在定義之前就使用了 xxx(警告)
Possibly incorrect assignment
賦值可能不正確
Redefinition of 'xxx' is not identical
xxx 的兩次定義不一致
Register allocation failure
寄存器定址失敗
Repeat count needs an lvalue
重復計數需要邏輯值
Size of structure or array not known
結構體或數組的大小不確定
Statement missing ;
語句後缺少";"
Structure or union syntax error
結構體或聯合體語法錯誤
Structure size too large
結構體的尺寸太大
Subscripting missing ]
下標缺少右方括弧
Superfluous &with function or array
函數或數組中有多餘的"&"
Suspicious pointer conversion
可疑的指針轉換
Symbol limit exceeded
符號超限
Too few parameters in call
函數調用時的實參少於函數的參數
Too many error or warning messages
錯誤或警告信息太多
Too much auto memory in function
函數中用到的局部存儲太多
Too much global data defined in file
文件中全局數據太多
Too consecutive dots
兩個連續的句點
Type mismatch in parameter xxx
參數xxx類型不匹配
Type mismatch in redeclaration of 'xxx'
xxx 重定義時的類型不匹配
Unable to create output file 'xxx'
無法建立輸出文件 xxx
Unable to open include file 'xxx'
無法打開被包容的文件 xxx
Bit field too large
位欄位太長
Unable to open input file 'xxx'
無法打開輸入文件 xxx
Undefined label 'xxx'
沒有定義的標號 xxx
Undefined structure 'xxx'
沒有定義的結構 xxx
Undefined symbol 'xxx'
沒有定義的符號 xxx
Unexpected end of file in comment started on line xxx
從 xxx 行開始的註解尚未結束,文件不能結束
Unexpected end of file in conditional started on line xxx
從 xxx 行開始的條件語句尚未結束,文件不能結束
Unknown assembler instruction
未知的匯編結構
Unknown option
未知的操作
Unknown preprocessor directive: 'xxx'
不認識的預處理命令 xxx
Unreachable code
無法到達的代碼
Unterminated string or character constant
字元串缺少引號
User break
用戶強行中斷了程序
Void functions may not return a value
void 類型的函數不應有返回值
Wrong number off arguments
調用函數時參數數目錯
'xxx' not an argument
xxx 不是參數
'xxx' not part of structure
xxx 不是結構體的一部分
xxx statement missing (
xxx 語句缺少左括弧
xxx statement missing )
xxx 語句缺少右括弧
xxx statement missing ;
xxx 語句缺少分號
'xxx' declared but never used
說明了 xxx ,但沒有使用
'xxx' is assigned a value which is never used
給 xxx 賦了值,但未用過
Zero length structure
結構體的長度為零
