我有兩個關於C++編程的問題。如何解釋下面的代碼?
1)int a[10] = new int*;
這個說法有效嗎?
2)extern void test(int a,int b) throw(const char *, RangeErr);
是什麼測試()做的,扔(爲const char *,RangeErr)指拋出兩個異常? RangeErr是什麼?爲什麼是外部?這個功能是做什麼的?
我有兩個關於C++編程的問題。如何解釋下面的代碼?
1)int a[10] = new int*;
這個說法有效嗎?
2)extern void test(int a,int b) throw(const char *, RangeErr);
是什麼測試()做的,扔(爲const char *,RangeErr)指拋出兩個異常? RangeErr是什麼?爲什麼是外部?這個功能是做什麼的?
1)不可以。您無法將值分配給裸露陣列。
2)test()
是該函數的名稱。 throw(...)
列出了它可以拋出的各種異常。 RangeErr
是某種類型或另一種類型。 extern
意味着該函數是在外部定義,並且是編譯單元的訪問的外部(即,從其他文件。)
1),所以沒有
2)這意味着,該功能可以和將只拋出的異常鍵入「const char *」和「RangeErr」。至於什麼RangeErr是我會的東西它將被定義在代碼中的其他地方,最有可能來自異常。外部電源的功能的代碼是外部鏈接(DLL,所以,或其他),你將不得不檢查該文件的lib,以瞭解它的作用。^^ 希望有所幫助。
1)無效。一個數組不是一個指針(雖然它可以在一些上下文中隱式轉換爲一個)。相反,嘗試:
int* a = new int[10];
2)這是一個函數聲明用(現在已廢棄&不明智的)投規範。外部是無關的和不必要的,但會指示「外部鏈接」,這意味着可以從其他編譯單元調用該函數。外部鏈接是未在匿名命名空間中定義或以其他方式聲明爲「靜態」的函數的默認值。
拋出指定表明此函數可以拋出兩種不同類型的異常(C風格的字符串和RangeErr異常對象,這很可能在庫中提供了此功能)。如果該函數試圖拋出任何其他類型的異常,std :: unexpected()被調用,默認情況下會終止程序。也就是說,我所知道的編譯器不僅僅是忽略了非空的throw規範,我相信爲C++ 11設計了不同的機制。
不是。數組是自動分配的。您可以使用指針而不是數組,而不是數組而不是指針。
由於您只發布了聲明,而不是定義,所以無法確定此函數的功能。 throw
顯示了它可以拋出什麼樣的異常,在這種情況下它將是一個C型字符串或一個RangeErr
,雖然每次只有一個。據推測已經定義了RangeErr
。 extern
表示該功能是在其他文件中定義的。
的throw
語法功能竟然是個錯誤,經過多年的實踐經驗。根據情況和編譯器的不同,throw()
可能會有所幫助,但通常情況下的異常規格會令人困惑,有時會阻止編譯器優化。從Herb Sutter看到這個Guru of the Week的帖子,他對C++有了一些瞭解。