Warum unterscheidet sich std :: uint32_t von uint32_t?

8

Ich bin ein bisschen neu in C ++ und ich habe eine Coding-Zuweisung mit vielen Dateien bereits, aber ich habe festgestellt, dass VS2012 scheint ein Problem mit der folgenden Aussage:

typedef std::uint32_t identifier;

Es scheint jedoch, dass es zu

geändert wird

typedef uint32_t identifier;

beseitigt den Fehler. 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?

    
Lunyx 14.02.2013, 20:55
quelle

2 Antworten

10

Der Unterschied besteht darin, dass einer innerhalb eines Namensraums 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 Beschrä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 einfügen, um die Version im Namespace std verfügbar zu machen (und möglicherweise die im globalen Namespace). Einschließlich stdint.h sollte nur die unqualifizierte Version verfügbar machen.

Eine frühere Version von Visual Studio wurde ohne diesen Header ausgeliefert, daher ist dies sicherlich problematisch.

Aufgrund all dieses Wahnsinns werden die meisten Leute auf eine Implementierung von Drittanbietern wie boost/cstdint.hpp zurückgreifen.

Bearbeiten: Sie sind gleich und dienen demselben Zweck. In der Regel: Wenn Sie die Version im Namensraum std verwenden möchten, schließen Sie cstdint ein. Wenn Sie den im globalen Namespace haben möchten, fügen Sie stdint.h hinzu. Für C ++ wird empfohlen, den im Namensraum 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.

    
pmr 14.02.2013, 21:06
quelle
7

uint32_t (aka ::uint32_t , d. h. die im globalen Namespace) wird in <stdint.h> deklariert. Dieser Header könnte auch im Namespace std als std::uint32_t deklarieren, aber dazu ist es nicht erforderlich.

std::uint32_t (d. h. der Name im Namespace std ) wird in <cstdint> deklariert. Dieser Header könnte ihn auch im globalen Namespace als ::uint32_t deklarieren, aber dies ist nicht erforderlich.

  

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?

Wenn Sie std::uint32_t verwenden möchten, müssen Sie #include <cstdint> eingeben, da der Code möglicherweise nicht kompiliert wird. Wenn es mit G ++ kompiliert wird, enthält vermutlich ein anderer Header indirekt <cstdint> , aber Sie sollten sich nicht darauf verlassen, die richtigen Header für die von Ihnen verwendeten Namen anzugeben.

    
Jonathan Wakely 14.02.2013 21:19
quelle

Tags und Links