C/C++編譯器錯誤程式碼大全
編譯器錯誤 C2001 錯誤訊息
常數中有換行符
字串常數不能繼續到第二行,除非進行下列操作:
•用反斜槓結束第一行。
•用一個雙引號結束第一行上的字串,並在下一行用另一個雙引號開始該字串。
用 \n 結束第一行是不夠的。
編譯器錯誤 C2002 錯誤訊息
無效的寬字元常數
多位元組字元常數是非法的。
通過檢查下面的可能原因進行修復
1.寬字元常數包含的位元組比需要的多。
2.未包括標準頭檔案
3.寬字元不能與一般字串連線。
4.寬字元常數之前必須是字元“L”:
編譯器錯誤 C2003 錯誤訊息
應輸入“defined id”
識別符號必須跟在前處理器關鍵字之後。
編譯器錯誤 C2004 錯誤訊息
應為“defined(id)”
識別符號必須出現在前處理器關鍵字之後的括號中。
也可能由於為 Visual Studio .NET 2003 進行的編譯器一致性工作生成此錯誤:在前處理器指令中缺少括號。
如果前處理器指令缺少右括號,則編譯器將生成一個錯誤。
編譯器錯誤 C2005 錯誤訊息
#line 應跟一個行號,卻找到“token”
#line 指令後面必須跟行號。
編譯器錯誤 C2006 錯誤訊息
“directive”應輸入檔名,卻找到“token”
諸如 #include 或 #import 等指令需要檔名。若要解決
編譯器錯誤 C2007 錯誤訊息
#define 語法
#define 後未出現識別符號。若要解決該錯誤,請使用識別符號。
編譯器錯誤 C2008 錯誤訊息
“character”: 巨集定義中的意外
該字元緊跟在巨集名之後。若要解決該錯誤,巨集名之後必須有一個空格。
編譯器錯誤 C2009 錯誤訊息
巨集形式“identifier”重複使用
巨集定義的形參表多次使用該識別符號。巨集的引數列表中的識別符號必須是唯一的。
編譯器錯誤 C2010 錯誤訊息
“character”: 巨集形參表中的意外
該字元在巨集定義的形參表中使用不正確。移除該字元以解決該錯誤。
編譯器錯誤 C2011 錯誤訊息
“identifier”:“type”型別重定義
該識別符號已定義為 type 型別。如果多次將某個型別庫匯入同一個檔案,也可能生成 C2011。
編譯器錯誤 C2012 錯誤訊息
在“<”之後缺少名稱
#include 指令缺少所需的檔名。
編譯器錯誤 C2013 錯誤訊息
缺少“>”
#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”
型別只有經過定義才能使用。若要解決該錯誤,請確保在引用型別前已對其進行了完全定義。
有可能宣告一個指向已宣告但未定義的型別的指標。但是 Visual C++ 不允許引用未定義的型別。
編譯器錯誤 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 錯誤訊息
非法 break
break 僅在 do、for、while 或 switch 語句中合法。
編譯器錯誤 C2044 錯誤訊息
非法 continue
continue 僅在 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 錯誤訊息
應輸入形參表,而不是型別表
函式定義包含引數型別列表而不包含形參表。ANSI C 需要命名的形參,除非它們是 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.名稱空間範圍不正確。例如,若要解析 ANSI C++ 標準庫函式和運算子,則必須用 using 指令指定 std 名稱空間。下面的示例未能編譯,因為 using 指令被註釋掉,並且在 std 名稱空間中定義了 cout:
編譯器錯誤 C2066 錯誤訊息
轉換到函式型別是非法的
在 ANSI C 中,函式指標和資料指標間的轉換是非法的。
編譯器錯誤 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”已有主體
函式已經定義。
在以前的 Visual C++ 版本中,
•編譯器將接受解析為同一實際型別的多個模板的專用化,儘管附加的定義將永遠不可用。現在編譯器將檢測這些多重定義。
•__int32 和 int 已被視為單獨的型別。編譯器現在將 __int32 作為 int 的同義詞處理。這意味著,如果函式同時在 __int32 和 int 上過載,編譯器將檢測多個定義,並提供一個錯誤。
編譯器錯誤 C2085 錯誤訊息
“identifier”: 不在形參表中
該識別符號在函式定義中宣告而未在形參表中宣告。(僅用於 ANSI C)
編譯器錯誤 C2086 錯誤訊息
“identifier”: 重定義
多次定義了該識別符號,或者後面的宣告與前一個不同。
C2086 也可能是增量編譯引用的 C# 程式集的結果。重新生成該 C# 程式集以解決此錯誤。
編譯器錯誤 C2087 錯誤訊息
“identifier”: 缺少下標
具有多個下標的陣列的定義缺少大於 1 的維度的下標值。
編譯器錯誤 C2088 錯誤訊息
“operator”: 對於“class-key”非法
沒有為結構或聯合定義該運算子。該錯誤只對 C 程式碼有效。
編譯器錯誤 C2089 錯誤訊息
“identifier”:“class-key”太大
指定的結構或聯合超過 4GB 的**。
編譯器錯誤 C2090 錯誤訊息
函式返回陣列
函式不能返回陣列。請返回指向陣列的指標。
編譯器錯誤 C2091 錯誤訊息
函式返回函式
函式不能返回函式。請返回指向函式的指標。
編譯器錯誤 C2092 錯誤訊息
“array name”陣列元素型別不能是函式
不允許使用函式陣列。請使用指向函式的指標的陣列。
編譯器錯誤 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 檔案或對錶達式進行簡化。
====================================================================================================================================
1.
事件:在非MFC環境中使用CStdioFile時,欲#include<afx.h>,提示連結錯誤如下
錯誤 1 error LNK2005: "void * __cdecl operator new[](unsigned int)" ([email protected]@Z) 已經在 libcpmtd.lib(newaop.obj) 中定義 D:\Code_CSharp\Code_Airport\Code_Airport\uafxcwd.lib(afxmem.obj) Code_Airport
原因:搜了下可能是MFC相關類庫與C++的類庫include的順序不對,然後造成某些符號提示重定義。
解決方法:將MFC的相關類庫在程式最開始的位置包含。此處,我將<afx.h>放在最開始的位置包含,重編譯即成功。
2.
事件:在c#中想呼叫dll提示如下錯誤:“無法載入dll 異常來自HRESULT:0X8007007E”
原因:經過百度,瞭解到應該是我想import的dll還有其他依賴的dll,經過將其依賴的opencvdll打包放一起之後,該錯誤提示消失。
3.
事件:這是一系列常見錯誤了,老出現,就是各種windows自帶的型別,如“CString,CRect等提示找不到符號”。
原因:其實是stdafx.h沒有成功include,修改下就好。
4.
事件:VS2010中設定的斷點無效:“當前不會命中斷點,還沒有為該文件載入任何符號”。
原因:折騰了一陣,其實問題主要出在沒有生成除錯資訊。比較弱的錯誤是在Release下執行,肯定進不了斷點,改成Debug就行;當然非得在Release下設定斷點的話,可以通過下面的解決方法來搞。
解決方法:
(1)專案-〉屬性-〉配置屬性-〉C/C++-〉常規-〉除錯資訊格式,這裡不能為“禁用”。
(2)專案-〉屬性-〉配置屬性-〉連結器-〉除錯-〉生成除錯資訊,這裡設為“是”。
5.
事件:VS2010安裝時由於想省時間因此沒有裝MSDN,現在又想裝MSDN。
解決方法:開啟VS工作介面,幫助->管理幫助設定,在彈出的選擇檔案對話方塊中選擇你當前需要將MSDN安裝到哪裡/路徑;選擇當前MSDN的案卷原始檔,一般在你的ISO檔案的ProductDocumentation目錄下的HelpContentSetup.msha檔案即可,以後程式會自動引導安裝;同時,在安裝之前,你還可以選擇安裝哪些幫助文件。
6.
事件:應用程式無法啟動,因為應用程式的並行配置不正確。
原因:win7的64位系統缺少x86庫檔案。
解決方法:安裝vcredist_x86
7.
事件:“mt.exe : general error c101008a: Failed to save the updated manifest to the file "./Debug/TransSliderControl.exe.embed.manifest"”vs編譯過程中給出如上提示。
解決方法:清理解決方案,再重新生成。
8.
事件:CLR無法從COM 上下文0x645e18 轉換為COM上下文0x645f88,這種狀態已持續60秒2010-01-20 09:08異常資訊:CLR無法從COM 上下文0x645e18 轉換為COM上下文0x645f88,這種狀態已持續60秒。擁有目標上下文/單元的執行緒很有可能執行的是非泵式等待或者在不傳送 Windows 訊息的情況下處理一個執行時間非常長的操作.這種情況通常會影響到效能,甚至可能導致應用程式不響應或者使用的記憶體隨時間不斷累積。要避免此問題,所有單執行緒單元(STA)執行緒都應使用泵式等待基元(如
CoWaitForMultipleHandles),並在執行時間很長的操作過程中定期傳送訊息
解決方法: 在Debug -> Exceptions -> Managed Debug Assistants裡 去掉ContextSwitchDeadlock一項前面的鉤。
在除錯(選單)-->異常--> Managed Debug Assistants裡 去掉ContextSwitchDeadlock一項前面的鉤。
9.
事件:可訪問性不一致: 欄位型別“a”比欄位“b"的訪問性低
解決辦法:在你的結構體或者是類,宣告一下訪問許可權,修改成public,這樣就不會有這些問題的存在。
====================================================================================================================================
1、error C2065: “IDD_DIALOG1” : 未宣告的識別符號
編譯時提示error C2065: “IDD_DIALOG1” : 未宣告的識別符號
錯誤的可能原因及解決方法如下:
1.出錯檔案中沒有包含資原始檔ID宣告的resource.h檔案。在出錯檔案中加入#include “resource.h”語句。
2.工程附件包含目錄的路徑下沒有resource.h檔案。修改路徑即可。
3.工程所在資料夾下存在resource.h檔案,但其中沒有資源ID的定義, 導致真正的resource.h沒有包含進去,刪除之。一個解決方案裡面有多個工程,可能會把所有資源ID的宣告放到一個檔案中。在各個工程中實現對話方塊 功能的檔案中,只需包含該檔案即可。但是,當新增某個資源以後,工程中會自動生成一個resource.h(不知道為什麼會這樣),而不是在已有的 resource.h檔案中新增ID的定義。由於工程編譯的時候先從本地搜尋標頭檔案,會包含了自動生成的標頭檔案,於是出現了上述錯誤。
注意:如果是智慧裝置程式出現此錯誤,應該確保resourceppc.h和Resourceppc.h中都有相同的巨集定義#define IDD_DIALOG1 XXX,並且在dialog.cpp中包含資源標頭檔案resourceppc.h
=====================================================================================================================================
2、error C2471: 無法更新程式資料庫 ,fatal error C1083: 無法開啟程式資料庫檔案
error C2471: 無法更新程式資料庫“c:documents and settings.......debugvc90.pdb”fatal error C1083: 無法開啟程式資料庫檔案:“c:documents and settings........debugvc90.pdb”: No such file or directory ....
解決方法:
修改一下設定,就可以解決C2471:
CC++ | General | Debug Information format | C7 Compatible (/Z7)
CC++ | Code Generation | Enable String Pooling | Yes (/GF)
Linker | General Debug Info | Yes (/DEBUG)
或者把在debug資料夾下的.pdb檔案給刪除了,f5一下就行了
=====================================================================================================================================
3、error無法開啟預編譯標頭檔案的解決方法及預編譯頭原理
1。用VC.NET編輯程式,按Ctrl+F7,出現下列錯誤:
fatal error C1083: 無法開啟預編譯標頭檔案:“Debug/UGFace.pch”: No such file or directory
解決方法:修改:專案->屬性->C/C++ ->預編譯頭->不使用預編譯頭 即可。
2。學用Visual C++ 6.0的第一個例程就讓我出了錯.用嚮導生成第一個基於對話方塊的Project之後,當我按照書上的源程式一個字一個字地輸進去之後,始終有一個錯誤:
fatal error C1010: unexpected end of file while looking for precompiled header directive.找了無數次之後,我決定把嚮導生成的包括標頭檔案的語句:include"StdAfx.h"保留(而這之前我是把它刪掉了的,因為書 上的例子沒有這句.)咦,這下就對了.這是為什麼呢?我百思不得其解。
來 到我的VC原始碼目錄,我注意到每個Project下面的DEBUG資料夾都特別大,而且一個副檔名為 .pch的檔案佔去了絕大部分,我刪掉之好像對程式編譯執行沒有什麼影響。於是抱著對.pch檔案的好奇,我在網上搜到了我疑惑之處的解答。這就是 VC++6.0給我們帶來的:預編譯標頭檔案。預編譯標頭檔案(一般副檔名為.PCH),是把一個工程中較穩定的程式碼預先編譯好放在一個檔案(.PCH)裡。 這些預先編譯好的程式碼可以是任何的C/C++程式碼,甚至可以是inline函式,只是它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的
程式碼。
為什麼需要預編譯標頭檔案?
一 言以蔽之:提高編譯速度.一般地,編譯器以檔案為單位編譯。如果修改了一工程中的一個檔案則所有檔案都要重新編譯,包括標頭檔案裡的所有東西 (eg.Macro巨集,Preprocessor預處理),而VC程式中,這些標頭檔案中所包括的東西往往是非常大的,編譯之將佔很長的時間。但它們又不常 被修改,是較穩定的,為單獨的一個小檔案而重新編譯整個工程的所有檔案導致編譯效率下降,因此引入了.PCH檔案。
如何使用預編譯標頭檔案以提高編譯速度?
要 使用預編譯標頭檔案,必須指定一個頭檔案(.H),它包含我們不會經常修改的程式碼和其他的標頭檔案,然後用這個標頭檔案來生成一個預編譯標頭檔案 (.PCH),VC預設的標頭檔案就是StdAfx.h,因為標頭檔案是不能編譯的,所以我們還需要一個.CPP檔案來作橋樑,VC預設的檔案為 StdAfx.cpp,這個檔案裡只有一句程式碼就是:#include "StdAfx.h"。接下來要用它生成.PCH檔案,涉及到幾個重要的預編譯指令:/Yu,/Yc,/Yx,/Fp。簡單地說,/Yc是用來生
成.PCH檔案的編譯開關。在Project->setting->C/C++的Category裡的Precompiled Header,然後在左邊的樹形檢視中選擇用來編譯生成.PCH檔案的.CPP檔案(預設即StdAfx.cpp),你
就可以看到/Yc這個開關,它表示這個檔案編譯了以後是否生成.PCH檔案(可能/Yc的c表示create)。/Fp指令指定生成的.PCH檔案的名字 及路徑(可能/Fp的p代表path)。/Yu的u即use,工程中只要包括了.H檔案的檔案都會有這個/Yu指令。如果選擇自動 Automatic...的話則原來為/Yc的地方就換成了/Yx指令。如果選擇自動,則每次編譯時編譯器會看以前有沒有生成過.PCH檔案,有則不現生 成否則就再次編譯產生.PCH檔案。
注意:
A, 實際上,由Appzard專案嚮導生成的預設的標頭檔案及CPP檔案StdAfx.h和StdAfx.cpp可以是任何名字的.原因很簡單。但如果你要這樣 做就要記得修改相應的Project->setting...下的幾個預編譯指(/Yc,/Yu,/Yx,/Fp)的引數。
B. 在任何一個包括了將要預編譯的標頭檔案而使用了.PCH檔案的工程檔案的開頭,一定必須要是在最開頭,你要包含那個指定生成.PCH檔案的.H檔案(通 過.CPP檔案包括,預設為StdAfx.cpp),如果沒包括將產生我最開頭產生的錯誤.如果不是在最開頭包括將產生讓你意想不到的莫名其妙錯誤,如若 不信,盍為試之?
C.預編譯檔案.PCH生成之很耗時間,而且生成之後它也很佔磁碟空間,常在5-6M,注意專案完成之後及時清理無用的.PCH檔案以節約磁碟空間。
D.如果丟了或刪了.PCH檔案而以後要再修改工程檔案時,可將指定的/Yc的.CPP檔案(預設為StdAfx.cpp)重新編譯一次即可再次生成.PCH檔案,不用傻傻的按F7或Rebuild All
以 前還碰到過另外一種情況:新建一個工程,隨便找一個cpp檔案,按ctrl+f7系統將會提示:fatal error C1083: 無法開啟預編譯的標頭檔案:”Debug/xxx.pch”: No such file or directory(其中xxx是工程的名字)這種情況也是一樣的原因,為vc的stdafx.h標頭檔案未編譯所致。也可以這樣解決:先F7,編譯後再 ctrf+f7。
注意:VS智慧裝置程式(如WM5)預編譯標頭檔案為stdafx.h。更改設定在專案->XXXX屬性->配置屬性->C/C++->預編譯頭 的右側第一項。=====================================================================================================================================
4、error:無法執行新增/移除操作,因為程式碼元素是隻讀的
vc2005error:無法執行新增/移除操作,因為程式碼元素是隻讀的
出現這種現象,多數是因為你的工程所在資料夾的屬性設定為了“只讀”,你可以關閉解決方案,然後重新開啟,就可以了,如果以後不想出現這樣的情況,把工程所在的資料夾屬性中的“只讀”去掉,就可以了。
解決方案:
1、重啟VS2005
2、檢視.h和.cpp檔案的屬性,有可能是隻讀的,修改屬性後就可以了
3、開啟Resource.h檔案看看 一看就知道了 有些定義重複了 可以手動改掉 儲存 編輯器重新載入
4、把你要新增事件的對話方塊相應的類檔案(*.h和*.cpp)給關了就可以了
5、關閉解決方案,刪除.ncb檔案重新新增即可
6、實在不行就手動新增訊息處理
在BEGIN_MESSAGE_MAP(。。。)
//這裡要刪掉你原先已經增加過的訊息隱射函式
END_MESSAGE_MAP()
=====================================================================================================================================
5、程式執行出現-1.#IND,1.#INF
C/C++程式執行有時候會出現-1.#IND,1.#INF,在除錯的時候輸出除數為0得出的結果,INF就是infinite,就是無窮大的意思
IND可能表示很小,不確定
//////////////////////////////////////////////////////////
使用類似於pow, exp等等函式時常會產生一個無效數字1.#IND00,在VC下可以通過與一個確定數字比較大小來判斷是否產生了無效數字,但這個方法在DEV-CPP下卻是行不通的。
其實解決辦法很簡單,使用
int _isnan(double x);
當x是一個無效值(NaN, Not a Number) 時,返回非零值
否則返回0
======================================================================================================================================
6、LINK : 上一個增量連結沒有生成它;正在執行完全連結
程式碼
#include"iostream"
using namespace std;
int main()
{
cout<<"123";
return 0;
}
LINK : 沒有找到 D:Visual Studio 2008ProjectstestDebugtes
出現這個提示,
1.你是第一次進行編譯,這時當然沒有生成過可執行檔案,也就無法增量連結了。
2.你上一次編譯的時候有錯誤,沒有生成可執行檔案。
=====================================================================================================================================
7、CListCtrl的NM_RCLICK訊息編譯錯誤、reinterpret_cast
在對話方塊中類中新增對CListCtrl控制元件右鍵處理的時候出現如下錯誤:
error C2440: 'reinterpret_cast' : cannot convert from 'NMHDR *' to 'NMITEMACTIVATE' Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast
需要把:LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);
; 改為: LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE*>(pNMHDR);
參考:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=339678
=================================================================================