编译出现的问题解决
1.exception handling 異常處理
知識(shí)點(diǎn)的補(bǔ)充
- 1.了解拋出異常時(shí)發(fā)生了什么 throwing raised
- 2.捕獲異常時(shí)的情況 catch
- 3.傳遞錯(cuò)誤對(duì)象的意義 (拋出表達(dá)式的類型,調(diào)用鏈決定處理那段代碼-handler)
異常處理:
1.讓一個(gè)函數(shù)發(fā)現(xiàn)了自己無(wú)法處理的錯(cuò)誤時(shí)throw拋出異常。一個(gè)庫(kù)的作者可以檢測(cè)出發(fā)生怎樣的錯(cuò)誤,卻不知道如何處理;庫(kù)的使用者處理錯(cuò)誤,卻無(wú)法檢測(cè)何時(shí)發(fā)生。這就需要最基本的異常檢測(cè)
2.C++中的錯(cuò)誤:
- 語(yǔ)法錯(cuò)誤(編譯錯(cuò)誤):變量為定義、缺少括號(hào)、關(guān)鍵字缺失等錯(cuò)誤可以在函數(shù)進(jìn)行編譯的時(shí)候發(fā)現(xiàn)錯(cuò)誤。編譯器可以告知發(fā)生錯(cuò)誤的位置、原因。容易去改正代碼
- 運(yùn)行時(shí)錯(cuò)誤:內(nèi)存越界、數(shù)組下標(biāo)等問(wèn)題,但是可以進(jìn)行編譯進(jìn)行運(yùn)行,運(yùn)行時(shí)會(huì)出現(xiàn)錯(cuò)誤導(dǎo)致程序的崩潰。就是為了更好的處理程序在運(yùn)行時(shí)候的錯(cuò)誤,引入了異常處理機(jī)制來(lái)解決問(wèn)題。
3.C語(yǔ)言使用的方法
- 1.int整形值來(lái)標(biāo)識(shí)錯(cuò)誤(整形的返回值 0or 1)
- 2.error的宏來(lái)實(shí)現(xiàn)
exception:
- bad_cast
- runtime_error:
- overflow_error
- underflow_error
- range_error
- logic_error:
- domain_error
- invalid_argument
- out_of_range
- length_error
- bad_alloc
代碼片段截取
//劍指offer(面試題11 旋轉(zhuǎn)數(shù)組中的最小數(shù)字) #include <iostream> #include <cstdlib> #include <exception> // using namespace std;int MinInOrder(int* numbers, int index1, int index2);int Min(int* numbers, int length) {if(numbers == nullptr || length <= 0)throw new std::exception("Invalid parameters"); // 出現(xiàn)錯(cuò)誤int index1 = 0;int index2 = length - 1;int indexMid = index1;// 如果數(shù)組旋轉(zhuǎn)了,則進(jìn)入數(shù)組,如果數(shù)組沒有旋轉(zhuǎn) 直接返回 index1 就是最小元素while(numbers[index1] >= numbers[index2]){// 如果index1和index2指向相鄰的兩個(gè)數(shù),// 則index1指向第一個(gè)遞增子數(shù)組的最后一個(gè)數(shù)字,// index2指向第二個(gè)子數(shù)組的第一個(gè)數(shù)字,也就是數(shù)組中的最小數(shù)字if(index2 - index1 == 1){indexMid = index2;break;}// 如果下標(biāo)為index1、index2和indexMid指向的三個(gè)數(shù)字相等,// 則只能順序查找indexMid = (index1 + index2) / 2;if(numbers[index1] == numbers[index2] && numbers[indexMid] == numbers[index1])return MinInOrder(numbers, index1, index2);// 縮小查找范圍if(numbers[indexMid] >= numbers[index1])index1 = indexMid;else if(numbers[indexMid] <= numbers[index2])index2 = indexMid;}return numbers[indexMid]; }直接修改
int Min(int* numbers, int length) {if(numbers == nullptr || length <= 0)throw new std::invalid_argument("Invalid parameters"); // 都是直接表示是什么錯(cuò)誤// 例如 throw std::overflow_error("too big") // 或者是 const std::exception& e關(guān)于 exception handling 異常處理還是需要學(xué)習(xí)
慢慢積累
2.頭文件定義問(wèn)題 “__declspec” 屬性不能使用
報(bào)錯(cuò)問(wèn)題
error: '__declspec' attributes are not enabled; use '-fdeclspec' or '-fms-extensions' to enable support for __declspec attributes
看一看代碼片段
// 結(jié)構(gòu)化定義一個(gè)鏈表結(jié)點(diǎn) // 并定義結(jié)點(diǎn)的基本函數(shù) struct ListNode {int m_nValue;ListNode* m_pNext; };// 這個(gè)問(wèn)題一直沒有解決,可能是xcode的配置問(wèn)題 /* error: '__declspec' attributes are not enabled; use'-fdeclspec' or '-fms-extensions' to enable support for __declspecattributes*/ // 注釋一下 // 也找不到解答,問(wèn)題看不懂 __declspec( dllexport ) ListNode* CreateListNode(int value); __declspec( dllexport ) void ConnectListNodes(ListNode* pCurrent, ListNode* pNext); __declspec( dllexport ) void PrintListNode(ListNode* pNode); __declspec( dllexport ) void PrintList(ListNode* pHead); __declspec( dllexport ) void DestroyList(ListNode* pHead); __declspec( dllexport ) void AddToTail(ListNode** pHead, int value); __declspec( dllexport ) void RemoveNode(ListNode** pHead, int value);解決辦法
哈哈哈,我能告訴你我沒有找到解決的辦法嗎?
沒有具體的文檔,而且不清楚這個(gè)是什么含義,這個(gè)問(wèn)題暫且擱置,后面解決
更新解決辦法
//解決的辦法也比較暴力,直接在頭文件中進(jìn)行修改 //直接將前面的刪除掉 //編譯環(huán)境 clang ListNode* CreateListNode(int value);void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);void PrintListNode(ListNode* pNode);void PrintList(ListNode* pHead);void DestroyList(ListNode* pHead);void AddToTail(ListNode** pHead, int value);void RemoveNode(ListNode** pHead, int value);轉(zhuǎn)載于:https://www.cnblogs.com/GeekDanny/p/10020166.html
總結(jié)
- 上一篇: Oracle数据类型与.NET中的对应关
- 下一篇: 解决webpack打包后-webkit-