2012-11-30 38 views
60

stdint.h ve cstdint arasındaki fark nedir?<cstdint> vs <stdint.h>

Her ikisi de MSVC'de (Visual Studio 2010) ve gcc-4.5.1'de bulunabilir. Ayrıca, her ikisi de intX_t/uintX_t türlerini tanımlar (burada X, türün bayt cinsinden boyutudır).

  • Her iki başlıktaki mantık aynıysa (taşınabilir tipler), hangileri hakkında karar vermek için almam gereken kararlar nelerdir? stdint.h

cstdint tip std ad yatıyor, herhangi bir ad olmadan her türünü tanımlar.

  • Tanımlı türleri std ad alanına dahil etmek veya dahil etmemek için herhangi bir neden var mı? İki başlık arasındaki fark nedir?

cstdintstdint.h.h uzantısını kullanan hiçbir dosya uzantısına sahip ve c önek kullanır.

  • Bu başlıklar için adlandırma kuralları nedir? c öneki bunun bir C kitaplığı olduğunu gösterir. cstdint dosya uzantısının eksik olmasının bir nedeni var mı? cstdint dahil
+0

OS X 10.8 ' 'eksik. Aldığım hata: * './Misc.h: 7: 10: ölümcül hata: 'cstdint' dosyası bulunamadı *. – jww

+2

İlgili: [C üstbilgileri C++ kullanırken, std :: veya global ad alanı işlevlerini kullanmalı mıyız?] (Http://stackoverflow.com/q/32606023/2020827) – sergej

cevap

88

C++ 98 orijinal niyeti o sadece C++ 11, ama <c*> ilave oluyor, genel ad alanını (iyi, özellikle değil <cstdint> kirliliğine yol açmaması için, C++ <cstdint> kullanması gerektiğini oldu genel olarak başlıklar). Bununla birlikte, simgelerin sembolleri yine de global isim-alanına koymakta ısrarcı olmuştur ve C++ 11 bu uygulamayı onaylamıştır [*]. [11] Yani, temel olarak üç seçenek vardır:

  • Kullanım <cstdint> ve ya tamamen kullandığınız ya da başka ayrıntılı çünkü using std::int32_t; vb (can sıkıcı ile kapsam içine getirmek her tamsayı türü nitelemek, ancak sadece için böyle yapmak doğru yolu C++ standart kütüphanede başka sembol)
  • Kullanım <stdint.h> (kullanımdan kaldırıldı çünkü biraz kötü)
  • Kullanım <cstdint> ve genel ad (garanti çünkü çok kötü) içinde semboller koyacağız uygulamanızı varsayalım. Uygulamada

kod sinir bozucu bir büyük miktarda o <cstdint> genel ad sembolleri koyar bir uygulama üstünde kaza yapmak kolay çünkü, son seçeneği kullanır şüpheleniyoruz. İlkini kullanmaya çalışmalısın. İkincisi, sadece belki de bunu yapmak yerine, global ad alanında bir şeyler koymak için garantili olduğunu bir erdem vardır. Bunun özellikle yararlı olduğunu düşünmüyorum, ancak önceliğiniz varsa, bazı yazımlar kaydedebilir.

Dördüncü seçenek var, #include <cstdint> ve bunu takiben using namespace std; takip ediyor, ancak bazen using namespace std;'u koymamanız gereken yerler var. Farklı insanlar bu yerlerin olduğu yerlerde farklı fikirlere sahip olacaklar, fakat "üstbilgi dosyasında en üst düzeyde", "sınırlı bir kapsamda" daha kötü olan "bir cpp dosyasında en üst düzeyde" daha kötüdür. Bazı insanlar asla using namespace std; yazmaz.

[*] Bu, C++ standart başlıklarının, genel ad alanına malzeme koymasına izin verilmesine rağmen, gerekli olmadığı anlamına gelir. Yani bu sembollerle çarpışmaktan kaçınmalısınız, ama aslında onları kullanamazsınız çünkü orada olmayabilirler. Temel olarak, C++'deki global isim alanı bir mayın tarlasıdır, bundan kaçınmaya çalışın.Komitenin, bir başlık dosyasında en üst düzeyde using namespace std; 'u yapıştırmak kadar zararlı olan uygulamalarla bir uygulamayı onayladığı iddia edilebilir. Bu fark, uygulamaların yalnızca C standart kütüphanesindeki semboller için yapmasıdır, oysaki using namespace std; bunu yapar. C++ için - sadece semboller. Standartta gelecek eklemeler için ayrılan isimleri listeleyen C standardında bir bölüm var. Bu isimleri C++ global ad alanında da saklı kalmak gibi aptalca bir fikir değil, ama şart değil.

+0

Geriye kalan tek cevapsız soru, başlık dosyalarının adlandırma kuralları hakkındadır, bu konu hakkında bilgi sahibi misiniz? –

+19

@PaperBirdMaster: C++ standart kitaplık başlıklarının dosya uzantılarına sahip olmadığı: "", "", "", C uyumluluğu için olanlar dışında: "", "". Ve evet, 'c' ifadesi, '''ün C++' nın C++ 'sının eşdeğeri' ' yerine, '' gibi C++' dan tamamen yeni olduğunu belirtiyor. C++ üstbilgisi var '', bu yüzden sadece C'nin gelecekteki bir sürümünün 'standart üstbilgisini tanıtmamasını umuyoruz. –

13

Küresel ad alanında muhtemelen sembol std ad alanında isim ve ithal ediyor.
stdint.h dahil, genel ad alanında ve muhtemelen std ad alanında sembol adlarını içe aktarır. C standart Kütüphanesi'nde ayrıca C standart Kütüphanesi'nde ve C standart kütüphanesinde karşılık gelen isimlere bir c tarafından önceden yerleştirilmiş oldukları genel bir adlandırma kuralı olarak sunulan özellikler de sunulmaktadır.

C++

, kullanarak edilmelidir: Tam

#include <cstdint> 

ve C std::
süre ile kullanmak sembol isimleri nitelemek, Sen kullanmalıdır:

#include <stdint.h> 

Ek D (normatif) Uyumluluk özellikleri [değer] durumlar:

D.içerir C6 standart kütüphane başlıkları

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.

:

<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>

ve ayrıca

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 C++ 11 başlıktır, stdint.h (Cı-C99 başlığıdır ve C++ farklı dillerdir!)

  2. MSVC 2008 ne stdint.h ne de cstdint'u içermez. Bazı ad alanı/dil düzeltmeleri ile çoğunlukla #include <stdint.h>cstdint uygulamalarının çoğu numaralı uygulamalardır.

+1

3. yanlıştır. 'cstdint', uygulamaların std' ad alanına taşınmasını gerektirir. –

+0

1. yanı sıra, stdint.h C++ standardının normatif D Ekinde C++ kütüphanesinin bir parçası olarak tanımlanmıştır. – chill

+0

@KonradRudolph, teşekkürler, düzeltildi. –

İlgili konular