2012-11-30 56 views
60

Sự khác nhau giữa stdint.hcstdint là gì?<cstdint> vs <stdint.h>

Cả hai đều có sẵn trong MSVC (Visual Studio 2010) và gcc-4.5.1. Ngoài ra, cả hai xác định các loại intX_t/uintX_t (trong đó X là kích thước tính theo byte của loại).

  • Nếu lý do trong cả hai tiêu đề giống nhau (loại di động), quyết định nào tôi phải thực hiện để quyết định cái này hay cái kia?

stdint.h xác định từng loại không có bất kỳ không gian tên nào, các loại cstdint nằm trong không gian tên std.

  • Có lý do gì để bao gồm hoặc không bao gồm các loại được xác định vào không gian tên std không? Sự khác biệt giữa hai tiêu đề là gì?

cstdint không có phần mở rộng tập tin và sử dụng tiền tố c, stdint.h sử dụng phần mở rộng .h.

  • Quy ước đặt tên cho tiêu đề này là gì? tiền tố c cho biết đây là thư viện C? có một lý do cho việc thiếu phần mở rộng tập tin trong cstdint?
+0

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

+2

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

Trả lời

88

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.

+0

Câu hỏi chưa được trả lời duy nhất còn lại là về các quy ước đặt tên của các tệp tiêu đề, bạn có biết về chủ đề này không? –

+19

@PaperBirdMaster: Tiêu đề thư viện chuẩn C++ không có đuôi tệp: '', '', '', ngoài các phần tử được bao gồm cho khả năng tương thích của C: '', ''. Và có, 'c' ban đầu chỉ ra rằng' 'là C++ tương đương với tiêu đề C tiêu chuẩn' ', thay vì hoàn toàn mới đối với C++ như' 'là. Có một tiêu đề C++ '', vì vậy chúng tôi sẽ chỉ phải hy vọng rằng không có phiên bản C nào trong tương lai giới thiệu tiêu đề chuẩn ''. –

13

Nhập tên biểu tượng vào không gian tên std và có thể là trong không gian tên chung.
Bao gồm stdint.h nhập tên biểu tượng trong Không gian tên chung và có thể là trong không gian tên std.

Các tính năng của thư viện chuẩn C cũng được cung cấp trong thư viện chuẩn C++ và như quy ước đặt tên chung, chúng được tiền tố c trỏ tới tên tương ứng trong thư viện chuẩn C.

Trong C++, Bạn nên sử dụng:

#include <cstdint> 

và hoàn toàn đủ điều kiện tên biểu tượng bạn sử dụng với std::
trong khi trong C, Bạn nên sử dụng:

#include <stdint.h> 

Phụ lục D (quy định) Các tính năng tương thích [depr] tiểu bang:

D.6 C tiêu đề thư viện chuẩn

1 For compatibility with the C standard library and the C Unicode TR, the C++ standard library provides the 25 C headers, as shown in Table 151.

Trong đó bao gồm:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

Và hơn nữa,

2 Every C header, each of which has a name of the form name.h , behaves as if each name placed in the standard library namespace by the corresponding cname header is placed within the global namespace scope. It is unspecified whether these names are first declared or defined within namespace scope (3.3.6) of the namespace std and are then injected into the global namespace scope by explicit using-declarations (7.3.3).

3 [ Example: The header <cstdlib> assuredly provides its declarations and definitions within the namespace std. It may also provide these names within the global namespace. The header <stdlib.h> assuredly provides the same declarations and definitions within the global namespace, much as in the C Standard. It may also provide these names within the namespace std. —end example ]

0
  1. cstdint là C++ 11 tiêu đề, stdint.h là tiêu đề C99 (C và C++ là các ngôn ngữ khác nhau!)

  2. MSVC 2008 không chứa stdint.h cũng không cstdint.

  3. Việc triển khai cstdint chủ yếu chỉ đơn giản là #include <stdint.h> với một số sửa lỗi không gian tên/ngôn ngữ.

+1

3. là sai. 'cstdint' cần phải nâng cấp các hiện thực vào không gian tên' std'. –

+0

1. cũng sai, stdint.h được định nghĩa là một phần của thư viện C++ trong Phụ lục D chuẩn của tiêu chuẩn C++. – chill

+0

@KonradRudolph, cảm ơn, đã sửa. –

Các vấn đề liên quan