2011-09-25 62 views
5

C++ 0x有兩個預定義的error_category對象:generic_category()system_category()。根據我迄今爲止瞭解的內容,system_category()應該用於操作系統返回的錯誤,generic_category()應該用於std::errc中的通用值,它們對應於errno的值。我應該在Unix上使用system_category或generic_category作爲errno嗎?

但是,在類Unix系統上應該做些什麼,其中errno操作系統返回的錯誤?我是否應該使用system_category()(在非類Unix系統上會出錯,需要#ifdef),還是應該使用generic_category()(對於非標準errno值,在類Unix系統上會出錯)?

+0

閱讀答案後,我仍然不確定要使用什麼。 – robert

回答

1

除非您實際上是操作系統(或報告操作系統特定功能的錯誤),否則不應使用system_category。該類別描述了錯誤源於何處,不一定是錯誤代碼的含義。因此,system_category的可能錯誤代碼與generic_category相同是完全合法的。

+1

讓我們看看我是否得到它:我應該總是使用'system_category()',因爲'errno'的值來自操作系統函數(或者來自調用操作系統函數的函數,或者來自函數稱爲一個稱爲...的函數)。但是在Win32上該怎麼做,因爲'system_category()'將用於'GetLastError()'值,而C庫函數會報告'errno'中的錯誤? – CesarB

+0

@CesarB - 這聽起來像尼科爾·布拉斯所寫的一樣。 :)如果errno已經被你調用的函數設置了,爲什麼要混淆它呢?但是如果你確實需要弄亂它,Nicol建議你使用'generic_category'。 – Marc

+0

@Marc:我在調用一個設置errno的函數(例如'epoll_ctl'或'open'),並且我想拋出一個'system_error'(包裝errno)以防錯誤。 – CesarB

1

您是指使用system_category()作爲C++標準庫函數都報告從OS(任何人,包括基於POSIX的操作系統,如Unix的)錯誤 - 看到報價C++ 11標準如下:

17.6.5.14錯誤代碼的值[value.error.codes]

1 C++標準庫中的某些函數通過std :: error_code(19.5.2.1)對象報告錯誤。 對於源自操作 系統的錯誤,對象的category()成員應返回std :: system_category(),或者引用實現定義的error_category對象,以查找其他地方發生的錯誤 。該實現應爲每個這些錯誤類別定義value()的可能值。 [示例:對於基於POSIX的操作系統,鼓勵實施將std :: system_category()值定義爲與POSIX errno值相同,其他值由操作系統文檔定義爲 。鼓勵在POSIX上不基於 的操作系統的實現定義與操作系統值相同的值。對於不是源自操作系統的錯誤,該實現可以爲關聯值提供枚舉。 - 結束示例]

+0

好吧,「從操作系統」並不像聽起來那麼清楚。 'errno'來自Unix上的libc(它是OS的一部分)。在Windows上,'errno'來自C運行庫,不一定是OS的一部分。無論如何,在Windows上,您無法將'system_category'用於'errno',因爲這應該被保留用於本機窗口錯誤。但是,如果你做了一個'fopen',在這兩種情況下你都想要同樣處理'errno'。 – ysdx

相關問題