編譯器固件大小不合法
Ⅰ vs2005,vs2008,vs2010編譯同一個c語言項目生成的dll文件為什麼不一樣大分別是252,380,246KB
優化方式和程度不有
不同的
編譯器
用的是可能是不同的優化方案(同一個編譯器不同的設置也會產生不同的結果,比如DeBug和Release)
優化方案取決於編譯器開發者的水平.發行編譯器時的
主流CPU
和編譯器將要運行的系統平台等因素,
比如DOS時代int_max=0xffff,
win32
時代int_max=0xffffffff,同樣是int變數,所佔用的內存空間就不同
再如同樣一條C語句:x=x+1;
早期的編譯器可能編譯成類似這樣的結果(這里用結果一詞而不用匯編語言,
匯編指令
,匯編代碼之類的詞是因為匯編=!
機器指令
)
mov
eax,x
add
eax,0x00000001
mov
x,eax
而優化的編譯器可能會把這條語句編譯成和
x+=1;
同樣的編譯結果:
mov
eax,x
inc
eax
//這條指令的執行速度和佔用內存的空間都要小
mov
x,eax
///////////////////////////////////////////////////////////////
類似的情況還有很多,因為這個回答是我一個字一個字打出來的,不是在哪個地方Copy的,指所以就不一一列舉了,總之:
這些小的差別積少成多,就影響了文件的大小!
Ⅱ 編譯錯誤: 只有定義在公共對象模塊中用戶定義類型能和變體類型相互轉換或傳遞給後期綁定功能。
編譯器錯誤C2001錯誤消息常數中有換行符字元串常數不能繼續到第二行,除非進行下列操作:•用反斜杠結束第一行。•用一個雙引號結束第一行上的字元串,並在下一行用另一個雙引號開始該字元串。用\n結束第一行是不夠的。編譯器錯誤C2002錯誤消息無效的寬字元常數多位元組字元常數是非法的。通過檢查下面的可能原因進行修復1.寬字元常數包含的位元組比需要的多。2.未包括標准頭文件STDDEF.h。3.寬字元不能與一般字元串連接。4.寬字元常數之前必須是字元「L」:編譯器錯誤C2003錯誤消息應輸入「definedid」標識符必須跟在預處理器關鍵字之後。編譯器錯誤C2004錯誤消息應為「defined(id)」標識符必須出現在預處理器關鍵字之後的括弧中。也可能由於為VisualStudio.NET2003進行的編譯器一致性工作生成此錯誤:在預處理器指令中缺少括弧。如果預處理器指令缺少右括弧,則編譯器將生成一個錯誤。編譯器錯誤C2005錯誤消息#line應跟一個行號,卻找到「token」#line指令後面必須跟行號。編譯器錯誤C2006錯誤消息「directive」應輸入文件名,卻找到「token」諸如#include或#import等指令需要文件名。若要解決該錯誤,請確保token是一個有效文件名。並且將該文件名放在雙引號或尖括弧中。編譯器錯誤C2007錯誤消息#define語法#define後未出現標識符。若要解決該錯誤,請使用標識符。編譯器錯誤C2008錯誤消息「character」:宏定義中的意外該字元緊跟在宏名之後。若要解決該錯誤,宏名之後必須有一個空格。編譯器錯誤C2009錯誤消息宏形式「identifier」重復使用宏定義的形參表多次使用該標識符。宏的參數列表中的標識符必須是唯一的。編譯器錯誤C2010錯誤消息「character」:宏形參表中的意外該字元在宏定義的形參表中使用不正確。移除該字元以解決該錯誤。編譯器錯誤C2011錯誤消息「identifier」:「type」類型重定義該標識符已定義為type類型。如果多次將某個類型庫導入同一個文件,也可能生成C2011。編譯器錯誤C2012錯誤消息在「」#include指令缺少右尖括弧。添加右尖括弧以解決該錯誤。編譯器錯誤C2014錯誤消息預處理器命令必須作為第一個非空白空間啟動預處理器指令的#符號必須是非空白行上的第一個字元。編譯器錯誤C2015錯誤消息常數中的字元太多一個字元常數包含的字元多於兩個。標准字元常數只能包含一個字元,長字元常數只能包含兩個字元。轉義序列(如\t)將被轉換為單個字元。當使用Microsoft擴展將字元常數轉換為整數時,也可能發生C2015。編譯器錯誤C2017錯誤消息非法的轉義序列轉義序列(如\t)出現在字元或字元串常數之外。當stringize運算符與包括轉義序列的字元串一起使用時會發生C2017。編譯器錯誤C2018錯誤消息未知字元「hexnumber」源文件包含一個意外的ASCII字元,該字元由其十六進制數標識。若要解決該錯誤,請移除該字元。編譯器錯誤C2019錯誤消息應找到預處理器指令,卻找到「character」該字元跟在#符號的後面,但它不是預處理器指令的第一個字母。編譯器錯誤C2020錯誤消息「member」:「class」成員重定義從基類或結構繼承的成員被重定義。不能重定義繼承成員,除非它在基類中被聲明為virtual。編譯器錯誤C2021錯誤消息應輸入指數值,而非「character」用作浮點常數的指數的字元是一個無效數字。確保使用的指數在范圍之內。編譯器錯誤C2022錯誤消息「number」:對字元來說太大字元或字元串常數中跟在反斜杠(\)後面的八進制數字太大,不能表示字元。編譯器錯誤C2026錯誤消息字元串太大,已截斷尾部字元該字元串的長度超過了16380個單位元組字元的**。連接相鄰字元串之前,字元串的長度不能超過16380個單位元組字元。大約為此長度的一半的Unicode字元串也會生成此錯誤。編譯器錯誤C2027錯誤消息使用了未定義類型「type」類型只有經過定義才能使用。若要解決該錯誤,請確保在引用類型前已對其進行了完全定義。有可能聲明一個指向已聲明但未定義的類型的指針。但是VisualC++不允許引用未定義的類型。編譯器錯誤C2028錯誤消息結構/聯合成員必須在結構/聯合中結構或聯合成員必須在結構或聯合內部聲明。編譯器錯誤C2030錯誤消息「identifier」:結構/聯合成員重定義結構或聯合將同一標識符用於多個成員。編譯器錯誤C2032錯誤消息「identifier」:函數不能是結構/聯合「structorunion」的成員該結構或聯合中的一個成員函數在C++中允許使用而在C中卻不允許。若要解決該錯誤,請編譯為C++程序或移除該成員函數。編譯器錯誤C2033錯誤消息「identifier」:位域不能有間接定址該位域被聲明為指針,這是不允許的。編譯器錯誤C2034錯誤消息「identifier」:位域類型對於位數太小該位域聲明中位的數目超過了基類型的大小。編譯器錯誤C2036錯誤消息「identifier」:未知的大小對identifier的操作需要數據對象的大小,而該大小無法確定。編譯器錯誤C2039錯誤消息「identifier1」:不是「identifier2」的成員該代碼錯誤調用或引用了結構、類或聯合的成員。編譯器錯誤C2040錯誤消息「operator」:「identifier1」與「identifier2」的間接定址級別不同涉及該運算符的表達式具有不一致的間接定址級別。如果兩個操作數都是算術的或都是非算術的(如數組或指針),則不用更改就可使用它們。如果一個操作數是算術的,而另一個不是,則算術運算符將轉換為非算術類型。編譯器錯誤C2041錯誤消息非法的數字「character」(用於基「number」)指定的字元不是基(如八進制或十六進制)的有效數字。編譯器錯誤C2042錯誤消息signed/unsigned關鍵字互相排斥在單個聲明中使用關鍵字signed和unsigned。編譯器錯誤C2043錯誤消息非法breakbreak僅在do、for、while或switch語句中合法。編譯器錯誤C2044錯誤消息非法continuecontinue僅在do、for或while語句中合法。編譯器錯誤C2045錯誤消息「identifier」:標簽重定義該標簽出現在同一函數中的多條語句之前。編譯器錯誤C2046錯誤消息非法的case關鍵字case只能出現在switch語句中。編譯器錯誤C2047錯誤消息非法的default關鍵字default僅能出現在switch語句中。編譯器錯誤C2048錯誤消息默認值多於一個switch語句包含多個default標簽。刪除其中一個default標簽可解決該錯誤。編譯器錯誤C2050錯誤消息switch表達式不是整型switch表達式計算結果為一個非整數值。若要解決該錯誤,請在switch語句中只使用整數值。編譯器錯誤C2051錯誤消息case表達式不是常數Case表達式必須是整數常數。編譯器錯誤C2052錯誤消息「type」:非法的case表達式類型Case表達式必須是整數常數。編譯器錯誤C2053錯誤消息「identifier」:寬字元串不匹配寬字元串被分配給了一個不兼容的類型。編譯器錯誤C2054錯誤消息在「identifier」之後應輸入「(」該函數標識符用在需要尾部括弧的上下文中。導致該錯誤的可能原因是省略了復雜初始化上的等號(=)。編譯器錯誤C2055錯誤消息應輸入形參表,而不是類型表函數定義包含參數類型列表而不包含形參表。ANSIC需要命名的形參,除非它們是void或是省略號()。編譯器錯誤C2056錯誤消息非法表達式表達式因前一個錯誤而無效。編譯器錯誤C2057錯誤消息應輸入常數表達式上下文要求常數表達式,即其值在編譯時已知的表達式。編譯器錯誤C2058錯誤消息常數表達式不是整型該上下文需要整數常數表達式。編譯器錯誤C2059錯誤消息語法錯誤:「token」該標記導致語法錯誤。若要確定原因,則不僅要檢查在錯誤信息中列出的行,還要檢查該行上面的行。下面的示例對聲明j的行生成了錯誤信息,而該錯誤的真正源卻出現在其上面的行中。如果對行的檢查沒有獲得有關可能出現的問題的任何線索,則嘗試注釋掉在錯誤信息中列出的行以及可能出現在該行上面的若干行。如果該錯誤信息在緊跟typedef變數的符號上出現,則檢查該變數是否已在源代碼中定義。如果符號沒有計算出任何結果(在使用/Dsymbol=編譯時可能發生),可能會導致C2059。可能收到C2059的另一個特定原因是編譯在函數的默認參數中指定了結構的應用程序。參數的默認值必須是一個表達式。初始值設定項列表(如用於初始化結構的初始值設定項列表)不是表達式。其解決方法是定義一個執行所需初始化的構造函數。編譯器錯誤C2060錯誤消息語法錯誤:遇到文件結束至少還需要一個標記。編譯器錯誤C2061錯誤消息語法錯誤:標識符「identifier」編譯器發現了不應在此出現的標識符。請確保在使用identifier之前對其進行聲明。初始值設定項可能括在了括弧中。為避免該問題,請將聲明符括在括弧中或使其成為typedef。在編譯器將表達式作為類模板參數檢測時也可能導致此錯誤;使用typename告訴編譯器它是一個類型。編譯器錯誤C2062錯誤消息意外的類型「type」編譯器不需要類型名稱。編譯器處理構造函數的參數列表中未定義類型的方式也可能導致C2062。如果編譯器遇到未定義的(拼錯了嗎?)類型,則它假定構造函數是一個表達式,並發出C2062。若要解決此錯誤,請只使用構造函數參數列表中的定義類型。編譯器錯誤C2063錯誤消息「identifier」:不是函數該標識符用作函數,但未聲明為函數。編譯器錯誤C2064錯誤消息項不會計算為接受「number」個參數的函數通過表達式調用了函數。該表達式未計算為函數指針。編譯器錯誤C2065錯誤消息「identifier」:未聲明的標識符在可使用變數的類型前必須在聲明中指定它。在可以使用函數前必須在聲明或原型中指定該函數使用的參數。可能的原因:1.您正在用C運行庫的調試版本進行編譯,在for循環中聲明標准C++庫迭代器變數,然後嘗試在for循環范圍外使用該迭代器變數。用C運行庫的調試版本編譯標准C++庫代碼暗指使用/Zc:forScope。有關信息,請參見調試迭代器支持。2.可能正在調用當前不受生成環境支持的SDK頭文件中的函數。3.省略必要的包含文件,尤其是在定義VC_EXTRALEAN、WIN32_LEAN_AND_MEAN或WIN32_EXTRA_LEAN時。這些符號從windows.h和afxv_w32.h中排除了一些頭文件以加快編譯。(在windows.h和afxv_w32.h中查找排除的頭文件的最新說明。)4.標識符名拼寫錯誤。5.標識符使用了錯誤的大小寫字母。6.字元串常數的後面缺少右引號。7.命名空間范圍不正確。例如,若要解析ANSIC++標准庫函數和運算符,則必須用using指令指定std命名空間。下面的示例未能編譯,因為using指令被注釋掉,並且在std命名空間中定義了cout:編譯器錯誤C2066錯誤消息轉換到函數類型是非法的在ANSIC中,函數指針和數據指針間的轉換是非法的。編譯器錯誤C2067錯誤消息轉換到數組類型是非法的對象被轉換成了數組類型。編譯器錯誤C2069錯誤消息「void」項到非「void」項的強制轉換類型void不能轉換成任何其他類型。編譯器錯誤C2070錯誤消息「type」:非法的sizeof操作數sizeof運算符需要一個表達式或類型名稱。編譯器錯誤C2071錯誤消息「identifier」:非法的存儲類聲明identifier所用的存儲類無效。編譯器錯誤C2072錯誤消息「identifier」:函數的初始化錯誤指定了函數初始值設定項。編譯器錯誤C2073錯誤消息「identifier」:部分初始化數組的元素必須有默認構造函數為用戶定義的類型或常數的數組指定的初始值設定項太少。如果沒有為數組成員指定明確的初始值設定項及其對應的構造函數,則必須提供默認的構造函數。編譯器錯誤C2074錯誤消息「identifier」:「class-key」初始化需要大括弧在指定的類、結構或聯合初始值設定項兩邊沒有大括弧。編譯器錯誤C2075錯誤消息「identifier」:數組初始化需要大括弧在指定的數組初始值設定項兩邊沒有大括弧。編譯器錯誤C2077錯誤消息非標量欄位初始值設定項「identifier」試圖用非標量(結構、聯合、數組或類)初始化位域。使用整數值或浮點值。編譯器錯誤C2078錯誤消息初始值設定項太多初始值設定項的數目超過了要初始化的對象數。編譯器錯誤C2079錯誤消息「identifier」使用未定義的類/結構/聯合「name」指定的標識符是一個未定義的類、結構或聯合。初始化匿名聯合時,可能會導致此錯誤。編譯器錯誤C2081錯誤消息「identifier」:形參表中的名稱非法標識符導致語法錯誤。此錯誤可能是由使用形參表的舊形式導致的。必須在形參表中指定形參的類型。編譯器錯誤C2082錯誤消息形參「identifier」的重定義在函數體中重新聲明了函數的形參。若要解決該錯誤,請移除該重定義。編譯器錯誤C2083錯誤消息結構/聯合比較非法結構或聯合直接與另一個用戶定義的類型進行比較。這是不允許的,除非已經定義了比較運算符或者存在到標量類型的轉換。編譯器錯誤C2084錯誤消息函數「function」已有主體函數已經定義。在以前的VisualC++版本中,•編譯器將接受解析為同一實際類型的多個模板的專用化,盡管附加的定義將永遠不可用。現在編譯器將檢測這些多重定義。•__int32和int已被視為單獨的類型。編譯器現在將__int32作為int的同義詞處理。這意味著,如果函數同時在__int32和int上重載,編譯器將檢測多個定義,並提供一個錯誤。編譯器錯誤C2085錯誤消息「identifier」:不在形參表中該標識符在函數定義中聲明而未在形參表中聲明。(僅用於ANSIC)編譯器錯誤C2086錯誤消息「identifier」:重定義多次定義了該標識符,或者後面的聲明與前一個不同。C2086也可能是增量編譯引用的C#程序集的結果。重新生成該C#程序集以解決此錯誤。編譯器錯誤C2087錯誤消息「identifier」:缺少下標具有多個下標的數組的定義缺少大於1的維度的下標值。編譯器錯誤C2088錯誤消息「operator」:對於「class-key」非法沒有為結構或聯合定義該運算符。該錯誤只對C代碼有效。編譯器錯誤C2089錯誤消息「identifier」:「class-key」太大指定的結構或聯合超過4GB的**。編譯器錯誤C2090錯誤消息函數返回數組函數不能返回數組。請返回指向數組的指針。編譯器錯誤C2091錯誤消息函數返回函數函數不能返回函數。請返回指向函數的指針。編譯器錯誤C2092錯誤消息「arrayname」數組元素類型不能是函數不允許使用函數數組。請使用指向函數的指針的數組。編譯器錯誤C2093錯誤消息「variable1」:無法使用自動變數「variable2」的地址初始化在用/Za編譯時,程序試圖將自動變數的地址用作初始值設定項。編譯器錯誤C2094錯誤消息標簽「identifier」未定義goto語句使用的標簽在函數中不存在。編譯器錯誤C2095錯誤消息「function」:實參具有類型「void」:「number」參數傳遞給函數的參數為void類型,這是不允許的。請改為使用指向void的指針(void*)。number指示哪一個參數為void。編譯器錯誤C2097錯誤消息非法的初始化通過檢查下面的可能原因進行修復1.使用非常數值初始化變數。2.用長地址初始化短地址。3.在用/Za編譯時,用非常數表達式初始化局部結構、聯合或數組。4.用包含逗號運算符的表達式初始化。5.用既非常數又非符號的表達式初始化。編譯器錯誤C2099錯誤消息初始值設定項不是常數此錯誤只由C編譯器發出,而且只對非自動變數發生。編譯器在程序的開頭對非自動變數進行初始化,並且用於對這些變數進行初始化的值必須是常數。由於編譯時與運行時的浮點精度環境設置(有關信息,請參見_controlfp_s)可能不同,因此,編譯器無法在/fp:strict下對表達式執行常數合並。在這種情況下,也可能發生C2099。當常數合並失敗時,編譯器調用動態初始化,這在C中是不允許的。要解決此錯誤,請將模塊編譯為.cpp文件或對表達式進行簡化。
Ⅲ 單片機編譯錯誤,求助。 程序是對的,這個好像是超出rom的范圍了,具體要怎麼改啊
您的KEIL是限製版的。限制編譯程序的大小。
找一個KEIL的破解軟體。
Ⅳ 編譯器可以修改棧大小,這個值可以隨意設置嗎
你說的那個默認1M的棧,應該指的是call stack(函數調用使用的棧)。這個棧用來存放函數調用時所傳遞的參數(並非所有參數都通過棧傳遞),棧指針,return address,寄存器的備份,還有每層函數的local variable。
1M大多數情況都是夠用的,如果用完可能會發生非法訪問等錯誤。可能會用完1M的情況:某個被調用的函數申請了一個很大的local variable,比如直接在棧上開個大數組之類的;還有就是遞歸調用,遞歸層數多了後很容易就用完1M。所以遞歸一般不要亂用。
Ⅳ 怎樣理解「Java編譯器不允許指定數組的大小」這句話
估計是翻譯的有問題,或者應該是在上下文中更好理解一些。
我是這樣理解的:
Java是面向對象的語言,對象都由引用標識,類似指針。數組也是對象,是數組對象,同樣由引用標識,而這個引用本身可以叫做數組,通常我們就是這么叫的,而實際上只不過是個引用,它指向一個位置,那裡才存放了數組元素,如下:
Integer[] iArray = new Integer[100];//這是正確的
其中iArray是整數數組,但它其實是個引用,類似個指針,引用和指針就無所謂數組大小,應該是這個意思。
但我可以分配一個100個元素的位置,然後用該引用指向它,如上。
Ⅵ 編譯程序時它說本地函數定義不合法,而這函數我是在其他函數中調用的,是什麼原因呢
(1) BOOL CVEmailDlg::CapSend() -- BOOL用大寫
(2) VEmailDlg.h 頭文件中加入原型聲明
BOOL CapSend();
Ⅶ visual c++編譯器出問題了
#define MAX 200;
很顯然 這里MAX被定義為一個數字,後面的 「;」是不能要的,要不就是定義了一個字元串「200;」改成這樣:
#define MAX 200
就ok了
winsock.h 是microsoft公司做的頭文件,不可能錯的,這一點確信無疑,除非你自己改動了裡面的內容
現在所報的winsock.h錯誤,都是由於你自己的程序裡面有錯誤,導致編譯器順序編譯到這個文件後不通才引起的,所以重點還是檢查你自己的代碼
Ⅷ C語言 大小寫轉換 問題在哪裡 能編譯 但是結果不對
scanf_s("%c",letter,1);
letter = tolower(letter); 這兩句有問題
Ⅸ C/C語言。每個編譯器構建出的exe大小不一樣的啊大好還是小好哪個編譯器什麼版本最好呢
大多數情況下都是越小越好的,這樣產生的冗餘代碼和數據就少。
編譯器無非就3種選擇:
1.微軟的VC++ complier
2.Borland的C++ complier
3.開源的gc++