2011-09-25 11 views
5

C++ 0x ma dwa predefiniowane obiekty error_category: generic_category() i system_category(). Z tego, co do tej pory rozumiałem, należy używać system_category() dla błędów zwracanych przez system operacyjny, a dla ogólnych wartości znalezionych w std::errc należy stosować wartości domyślne, które odpowiadają wartościom errno.Czy należy używać system_category lub generic_category dla errno na Unixie?

Co jednak należy zrobić w systemach uniksowych, gdzie errno wartości błędów zwracanych przez system operacyjny? Czy powinienem używać system_category() (co byłoby błędem w systemach nie-podobnych do Uniksowych, wymagających #ifdef), czy też powinienem używać generic_category() (co byłoby błędem w systemach uniksowych dla niestandardowych wartości errno)?

+0

Po przeczytaniu odpowiedzi nadal nie jestem pewien, czego używać. – robert

Odpowiedz

1

Nie powinieneś używać system_category, chyba że jesteś w rzeczywistości systemem operacyjnym (lub zgłaszania błędu z funkcji specyficznej dla systemu operacyjnego). Kategoria opisuje, skąd pochodzi błąd, niekoniecznie co oznacza kod błędu. Więc jest całkowicie uzasadnione, aby zestaw możliwych kodów błędów od system_category był taki sam jak generic_category.

+1

Zobaczmy, czy otrzymuję: powinienem zawsze używać 'system_category()', ponieważ wartość 'errno' pochodzi z funkcji systemu operacyjnego (lub z funkcji, która wywołała funkcję systemu operacyjnego, lub z funkcji, która nazywana jest funkcją, która wywołała ...). Ale co zrobić na Win32, ponieważ 'system_category()' byłoby dla wartości 'GetLastError()', a funkcje biblioteki C zgłosiłyby błędy w 'errno'? – CesarB

+0

@CesarB - To brzmi jak przeciwieństwo tego, co napisał Nicol Bolas. :) Jeśli errno było już ustawione przez funkcję, którą wywołałeś, po co z nią zadzierać? Ale jeśli musisz z tym pogodzić, Nicol zaleca użycie "ogólnej_kategorii". – Marc

+0

@Marc: Wywołuję funkcję, która ustawia errno (na przykład 'epoll_ctl' lub' open'), i chcę rzucić 'system_error' (zawijanie errno) w przypadku błędu. – CesarB

1

Państwo mają zgłosić błędy z OS (jednego, w tym systemów operacyjnych POSIX oparte takich jak Unix) używając system_category() jak C++ funkcji standardowej biblioteki nie - patrz cytat z C++ 11 norma poniżej:

17.6.5.14 Wartość kodów błędów [wartość.error.kody]

1 Pewne funkcje w bibliotece standardowej C++ raportują błędy za pośrednictwem obiektu std :: error_code (19.5.2.1). Ten obiekt category() z obiektu powinien zwrócić std :: system_category() dla błędów pochodzących z działającego systemu systemu lub odwołania do obiektu error_category zdefiniowanego w ramach implementacji dla błędów pochodzących z innych źródeł niż . Implementacja powinna określać możliwe wartości wartości() dla każdej z tych kategorii błędów. [Przykład: W przypadku systemów operacyjnych opartych na POSIX, zaleca się implementacje zdefiniowania wartości std :: system_category() jako identycznych z wartościami errno POSIX, z dodatkowymi wartościami zdefiniowanymi jako według dokumentacji systemu operacyjnego. Implementacje dla systemów operacyjnych, które nie są oparte na standardzie na POSIX są zachęcane do definiowania wartości identycznych z wartościami systemu operacyjnego. W przypadku błędów, które nie pochodzą z systemu operacyjnego, implementacja może zawierać wartości wyliczeniowe dla powiązanych wartości. -Na przykład]

+0

Cóż "z systemu operacyjnego" nie jest tak jasne, jak się wydaje. 'errno' pochodzi z biblioteki libc na systemie Unix (która jest częścią systemu operacyjnego). W systemie Windows 'errno' pochodzi z środowiska wykonawczego C, które niekoniecznie jest częścią systemu operacyjnego.A w systemie Windows nie można używać 'system_category' dla' errno', ponieważ powinno to być zarezerwowane dla natywnych błędów systemu Windows. Jednakże jeśli robisz 'fopen', w obu przypadkach chciałbyś obsłużyć' errno' tak samo. – ysdx

Powiązane problemy