2009-09-24 41 views
26

Trong C99, tôi bao gồm stdint.h và cung cấp cho tôi UINT32_MAX cũng như uint32_t. Tuy nhiên, trong C++, UINT32_MAX được xác định. Tôi có thể xác định __STDC_LIMIT_MACROS trước khi bao gồm stdint.h, nhưng điều này không hoạt động nếu ai đó bao gồm tiêu đề của tôi sau khi đã bao gồm stdint.h mình.Tương đương với C++ của UINT32_MAX là gì?

Vì vậy, trong C++, cách tiêu chuẩn để tìm ra giá trị tối đa thể hiện trong uint32_t là gì?

+7

lưu ý phụ bên cạnh: '#include ' trong C++ – AJG85

+0

@ AJG85 có câu trả lời đúng. –

Trả lời

48

Vâng, tôi không biết về uint32_t nhưng đối với các loại cơ bản (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double), bạn nên sử dụng các mẫu numeric_limits qua #include <limits>.

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

Nếu uint32_t là một #define của một trong những trên hơn mã này nên làm việc ra khỏi hộp

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

hoặc nếu 'uint32_t' là một' typedef' của một trong những điều trên? –

+0

Tôi chắc chắn hy vọng đó là một typedef. Nếu công cụ của bạn sử dụng '# define' cho điều đó, tôi sẽ hỏi chất lượng của chúng. – John

+0

Để tránh numeric_limits :: min(), number_limits :: max() bị nhầm lẫn với std :: min() và std :: max() tôi đã phải kèm theo nó trong dấu ngoặc đơn như sau: (std :: numeric_limits :: max)(); –

18

std::numeric_limits<T>::max() xác định giá trị tối đa cho loại T.

20

Vâng, uint32_t sẽ luôn là 32 bit, và luôn luôn được unsigned, vì vậy bạn có thể an toàn xác định nó bằng tay:

#define UINT32_MAX (0xffffffff) 

Bạn cũng có thể làm

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

Chúng tôi không cần phải sử dụng đến điều đó khi chúng tôi có các cấu trúc C++ chuẩn hoàn toàn hợp lệ chỉ sử dụng gấp 3 lần số ký tự. – John

+1

@ John: Đây là tiêu chuẩn hoàn hảo và di động là tốt. –

+0

Và các thư viện chuẩn có thể không phải lúc nào cũng khả dụng - đối với mã mô-đun hạt nhân, ví dụ: ... – mtahmed

1

Bạn có thể để loại bỏ các #include vấn đề trật tự bằng cách thay đổi quá trình xây dựng của bạn để xác định biểu tượng __STDC_LIMIT_MACROS trên dòng lệnh biên dịch thay vì:

cxx -D__STDC_LIMIT_MACROS ... 

Tất nhiên, bạn vẫn sẽ gặp khó khăn nếu một tiêu đề #undef biểu tượng này.

Ngoài ra, các tác giả của việc triển khai thư viện chuẩn mà bạn đang sử dụng có thể không có ý định cho người dùng đặt biểu tượng cụ thể đó; có thể có một lá cờ trình biên dịch hoặc một biểu tượng khác mà người dùng được dự định sử dụng để bật các kiểu C99 trong C++.

1

Tôi không thể nhận xét vì vậy đây là ý kiến ​​của tôi về câu trả lời của Glen so với Lior Kogan.

Nếu bạn đang sử dụng biến tĩnh, bạn sẽ gặp phải vấn đề nếu bạn chỉ định giá trị không đổi bên trong một lớp cho numeric_limits :: max() giá trị đó sẽ được đặt thành 0 do thứ tự khởi tạo (xem bài đăng này zero initialization and static initialization of local scope static variable)

Vì vậy, trong trường hợp đó, nó sẽ chỉ hoạt động bằng cách sử dụng câu trả lời của Lior Kogan.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan 
#define UINT32_MAX ((uint32_t)-1) 
Các vấn đề liên quan