2013-02-14 15 views
8

Ich bin ein bisschen neu in C++ und ich habe eine Codierung Zuordnung mit vielen Dateien bereits getan, aber ich bemerkte, dass VS2012 ein Problem mit der folgenden Aussage zu haben scheint:Warum unterscheidet sich std :: uint32_t von uint32_t?

typedef std::uint32_t identifier;

jedoch es scheint, dass es zu

typedef uint32_t identifier;

entledigt sich der Fehler zu ändern. Es gibt keine Includes und dies ist in der Header-Datei. Ich habe bemerkt, dass die Definition in stdint.h ist. Wenn das der Fall ist, warum ist dieser Code außerhalb von VS akzeptabel (dh kompiliert richtig mit g ++), ist aber in VS nicht akzeptabel? Kann mir bitte jemand das erklären?

+0

Es ist ein Fehler in VS 2010. Ich kann VS 2012 nicht testen, weil die Benutzeroberfläche zu unbrauchbar war, um installiert zu bleiben. –

+4

Ich glaube, Sie müssen 'Cstdint' enthalten, um die mit dem Namespace std – Caesar

+1

@CodyGray das OP scheint VS2012 zu verwenden, so dass die Benutzeroberfläche nicht so unbrauchbar ist. –

Antwort

10

Der Unterschied ist, dass man in einem Namensraum ist und der andere nicht. Ansonsten sollten sie gleich sein. Die erste soll die C-Version sein und die zweite ist die C++ - Version. Vor C++ 11 war es vorgeschrieben, dass die Einfügung der Präfix-Versionen anstelle der C-Standard-Bibliotheksversion alle C-Definitionen in den Standard-Namensraum einbringt. In C++ 11 wurde diese Einschränkung gelockert, da dies nicht immer möglich ist.

Es könnte sein, dass Ihr Compiler diesen Typ implizit definiert. In jedem Fall sollten Sie cstdint einschließen, um die Version im Namespace std zur Verfügung zu stellen (und möglicherweise die im globalen Namespace). Einschließlich stdint.h sollte nur die unqualifizierte Version verfügbar machen.

Frühere Version von Visual Studio ohne diesen Header ausgeliefert, so dass dies lästig sein wird.

Aufgrund all dieser Verrücktheit werden die meisten Menschen auf eine Implementierung von Drittanbietern wie boost/cstdint.hpp zurückgreifen.

Bearbeiten: Sie sind die gleichen und dienen dem gleichen Zweck. In der Regel: Wenn Sie die Version im Namespace std verwenden möchten, geben Sie cstdint ein. Wenn Sie die im globalen Namespace haben möchten, geben Sie stdint.h ein. Für C++ wird empfohlen, den im Namespace std zu verwenden. In der Regel: Geben Sie immer an, was Sie verwenden, und verlassen Sie sich nicht auf andere Header, die Dinge für Sie enthalten.

+0

Aber im Wesentlichen ist ihre Funktionalität identisch? – Lunyx

+0

@Daniel Ja. Ich hätte das mehr betonen sollen. Das ganze Gerede über kaputte Compiler ist wahrscheinlich verwirrender als hilfreich. – pmr

7

uint32_t (auch bekannt als ::uint32_t, d. H. Die im globalen Namespace) wird in <stdint.h> deklariert. Dieser Header könnte auch im Namespace std, wie std::uint32_t deklarieren, aber es ist nicht erforderlich, dies zu tun.

std::uint32_t (d. H. Der in Namespace std) wird in <cstdint> deklariert. Dieser Header könnte auch im globalen Namespace deklarieren, wie ::uint32_t, aber es ist nicht erforderlich, dies zu tun.

Wenn das der Fall ist, warum ist dieser Code außerhalb von VS akzeptabel (dh kompiliert ordnungsgemäß mit g ++), ist aber in VS nicht akzeptabel? Kann mir bitte jemand das erklären?

Wenn Sie verwenden möchten std::uint32_t dann müssen Sie #include <cstdint>, oder der Code kann nicht kompiliert werden. Wenn es mit G ++ kompiliert, dann enthält vermutlich ein anderer Header indirekt <cstdint>, aber Sie sollten sich nicht darauf verlassen, die richtigen Header für die Namen, die Sie verwenden, einzuschließen.

Verwandte Themen