2009-09-24 16 views
26

W C99 dołączam stdint.h, co daje mi UINT32_MAX oraz uint32_t. Jednak w C++ zdefiniowano UINT32_MAX. Mogę zdefiniować __STDC_LIMIT_MACROS przed włączeniem stdint.h, ale to nie zadziała, jeśli ktoś uwzględni mój nagłówek po tym, jak już sam zawiera stdint.h.Co to jest odpowiednik UINT32_MAX w C++?

Tak więc w C++, jaki jest standardowy sposób ustalania maksymalnej wartości reprezentowanej w uint32_t?

+7

nekromancji dygresja: '' #include w C++ – AJG85

+0

@ AJG85 ma poprawną odpowiedź. –

Odpowiedz

48

Cóż, nie wiem, o uint32_t ale dla podstawowych typów (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) należy użyć numeric_limits szablony poprzez #include <limits>.

cout << "Minimum value for int: " << numeric_limits<int>::min() << endl; 
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl; 

Jeśli uint32_t jest #define jednego z wyżej niż ten kod powinien działać po wyjęciu z pudełka

cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl; 
+3

lub jeśli 'uint32_t' jest' typedef' jednego z powyższych? –

+0

Mam nadzieję, że to typedef. Jeśli twoje narzędzia używają do tego '# define', kwestionuję ich jakość. – John

+0

Aby uniknąć numeric_limits :: min(), numeric_limits :: max() przed myleniem ze std :: min() i std :: max() musiałem zamknąć to w nawiasach takich jak to: (std :: numeric_limits :: max)(); –

18

std::numeric_limits<T>::max() definiuje maksymalną wartość dla typu T.

20

Dobrze, uint32_t zawsze być 32 bit, i zawsze być podpisane, więc można bezpiecznie zdefiniować go ręcznie:

#define UINT32_MAX (0xffffffff) 

można również zrobić

#define UINT32_MAX ((uint32_t)-1) 
+20

Nie musimy uciekać się do tego, gdy mamy doskonale prawidłowe standardowe konstrukty C++, które używają tylko 3 razy więcej znaków. – John

+1

@John: To jest również standardowe i przenośne. –

+0

A standardowe biblioteki mogą nie zawsze być dostępne - dla kodu modułu jądra np. ... – mtahmed

1

Możesz być w stanie wyeliminować #include problemy rzędu zmieniając proces kompilacji do określenia __STDC_LIMIT_MACROS symbol w linii poleceń kompilatora Zamiast:

cxx -D__STDC_LIMIT_MACROS ... 

Oczywiście, że nadal masz problemy, jeśli nagłówek #undef s ten symbol.

Również autorzy standardowej implementacji biblioteki, których używasz, nie zamierzali ustawiać tego symbolu dla użytkowników; może być flaga kompilatora lub inny symbol, którego użytkownicy mają używać do włączania typów C99 w C++.

1

Nie mogę komentować, więc oto mój wkład w odpowiedź Glen kontra Liora Kogana.

Jeśli używasz zmiennych statycznych, napotkasz problem, że jeśli przypiszesz stałą wartość w klasie do numeric_limits :: max(), ta wartość będzie w rzeczywistości ustawiona na zero ze względu na kolejność inicjalizacji (zobacz ten post: zero initialization and static initialization of local scope static variable)

W takim przypadku będzie działał tylko przy użyciu odpowiedzi Lior Kogana.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan 
#define UINT32_MAX ((uint32_t)-1) 
Powiązane problemy