Mục đích ban đầu trong C++ 98 là bạn nên sử dụng <cstdint>
trong C++, để tránh gây ô nhiễm không gian tên toàn cầu (tốt, không <cstdint>
nói riêng, đó là chỉ thêm vào trong C++ 11, nhưng <c*>
tiêu đề nói chung).
Tuy nhiên, việc triển khai vẫn tiếp tục đặt các ký hiệu vào không gian tên chung và C++ 11 đã phê chuẩn thực hành này [*]. Vì vậy, về cơ bản bạn có ba tùy chọn:
- Sử dụng
<cstdint>
và một trong hai hội đủ điều kiện đầy đủ từng loại nguyên bạn sử dụng hoặc nếu không đưa nó vào phạm vi với using std::int32_t;
vv (khó chịu vì tiết, nhưng nó đúng cách để làm điều đó giống như cho bất kỳ biểu tượng khác trong thư viện chuẩn C++)
- Sử dụng
<stdint.h>
(hơi xấu vì bị phản đối)
- Sử dụng
<cstdint>
và giả định thực hiện của bạn sẽ đặt những biểu tượng trong không gian tên toàn cầu (rất xấu vì không được bảo đảm).
Trong thực tế, tôi nghi ngờ rằng một số lượng lớn mã phiền toái sử dụng tùy chọn cuối cùng, đơn giản là do dễ dàng thực hiện một cách ngẫu nhiên khi thực hiện <cstdint>
đặt ký hiệu trong không gian tên chung. Bạn nên cố gắng sử dụng đầu tiên. Thứ hai có một đức hạnh, rằng nó là đảm bảo để đặt công cụ trong không gian tên toàn cầu thay vì chỉ có thể làm điều đó. Tôi không nghĩ rằng đó là đặc biệt hữu ích, nhưng nó có thể tiết kiệm một số đánh máy nếu đó là ưu tiên của bạn.
Có tùy chọn thứ tư, #include <cstdint>
theo sau là using namespace std;
đôi khi hữu ích nhưng có những nơi bạn không nên đặt using namespace std;
. Những người khác nhau sẽ có những ý tưởng khác nhau ở những địa điểm đó, nhưng "ở cấp cao nhất trong tệp tiêu đề" tệ hơn "ở cấp cao nhất trong tệp cpp", điều này còn tệ hơn "trong phạm vi giới hạn". Một số người không bao giờ viết using namespace std;
.
[*] Điều đó có nghĩa là tiêu đề chuẩn C++ được phép đặt nội dung trong không gian tên chung nhưng không bắt buộc. Vì vậy, bạn phải tránh va chạm với những biểu tượng đó, nhưng bạn thực sự không thể sử dụng chúng vì chúng có thể không ở đó. Về cơ bản, không gian tên toàn cầu trong C++ là một bãi mìn, cố gắng tránh nó.Người ta có thể cho rằng ủy ban đã phê chuẩn thực hành bằng cách triển khai thực hiện gần như có hại khi gắn bó using namespace std;
ở cấp cao nhất trong tệp tiêu đề - sự khác biệt là việc triển khai chỉ thực hiện cho biểu tượng trong thư viện chuẩn C, trong khi using namespace std;
cho C++ - cũng chỉ có các biểu tượng. Có một phần trong tiêu chuẩn C liệt kê các tên được đặt trước để bổ sung cho tiêu chuẩn trong tương lai. Nó không phải là một ý tưởng hoàn toàn ngu ngốc để đối xử với những tên như được đặt trong không gian tên toàn cầu C++, nhưng nó không cần thiết.
Nguồn
2012-11-30 10:08:03
OS X 10.8 thiếu ''. Đây là lỗi tôi nhận được: * './Misc.h: 7: 10: lỗi nghiêm trọng: 'cstdint' không tìm thấy tập tin' *. –
jww
Liên quan: [Khi sử dụng các tiêu đề C trong C++, chúng ta có nên sử dụng các hàm từ std :: hoặc không gian tên chung?] (Http://stackoverflow.com/q/32606023/2020827) – sergej