Frage

Erhöhung der C99 stdint Implementierung ist furchtbar praktisch. Eine Sache nervt mich, though. Sie werfen alle ihre typedefs in die boost namespace. Dies läßt mich mit drei Möglichkeiten, wenn diese Einrichtung mit:

  1. Verwenden Sie "using namespace boost"
  2. Verwenden Sie "using boost::[u]<type><width>_t"
  3. beziehen sich explizit auf den Zieltyp mit dem boost:: Präfix; z.B. boost::uint32_t foo = 0;

  • Option ? 1 Art von Niederlagen der Punkt von Namensräumen. wenn verwendet, auch innerhalb lokalen Bereich (beispielsweise innerhalb einer Funktion), Dinge wie Funktionsargumente immer noch wie Option vorangestellt werden müssen ? 3.
  • Option ? 2 ist besser, aber es gibt eine Reihe von dieser Art, so dass es laut werden kann.
  • Option ? 3 fügt ein extremes Maß an Lärm; der boost:: Präfix oft = der Länge der in Rede stehenden Art.

Meine Frage ist: Was ist der eleganteste Weg wäre, alle diese Arten in den globalen Namensraum zu bringen? Soll ich schreibe nur einen Wrapper um boost/cstdint.hpp die Option nutzt ? 2 und mit ihr geschehen?


Auch das Einwickeln der Header wie so nicht funktioniert auf VC ++ 10 (Probleme mit der Standard-Bibliothek-Header):

namespace Foo
{
  #include <boost/cstdint.hpp>

  namespace boost_alias = boost;
}

using namespace Foo::boost_alias;

EDIT: Ich denke, eine weitere Option ist es, den Prä-Prozessor zu verwenden, um es auf VC 10 funktioniert? Unter dem Snippet oben:

#ifndef FOO_HPP_INCLUDED
#define FOO_HPP_INCLUDED

#if _MSC_VER >= 1600 /*VC++ 10*/ || defined USE_NATIVE_STDINT_HEADER
  #include <stdint.h>
#else
  namespace cstdint_wrapper
  {
    #include <boost/cstdint.hpp>

    namespace boost_alias = boost;
  }

  using namespace cstdint_wrapper::boost_alias;
#endif

#endif

Weniger Arbeit, ich denke?

War es hilfreich?

Lösung

Ich verwende nur C99 den stdint.h (es ist jetzt tatsächlich in VS 2010). Für die Versionen von Visual C / C ++, die es nicht sind, verwende ich eine Public-Domain-Version von MinGW, dass ich die Arbeit mit VC6 geändert (aus, wenn ich zur Arbeit in VC6 hatte):

Es gibt ein paar andere Optionen, die Sie in dieser Frage SO betrachten könnten: C99 stdint.h Header und MS Visual Studio

Wenn Sie möchten, mit boost/cstdint.hpp fortzusetzen, würde ich sagen, dass der Vorschlag, einen Wrapper-Header der Implementierung, die die Typen in die globale Namespace bringt wäre der Weg zu gehen.

Does boost/cstdint.hpp bietet alles, was ich über das ist nicht in stdint.h wissen sollte?

Andere Tipps

Ihre Idee, einen Wrapper-Header zu schreiben, dass Geräte Option 2 ist definitiv die bessere diese drei Optionen.

Was ich vorschlagen würde, ist allerdings eine leichte Variante: Setzen Sie diese using Erklärungen innerhalb eines anderen Namespace, wie cstdint oder etwas; dann haben Sie die Option, wenn using cstdint; in Ihrem eigenen Code setzen oder explizit cstdint:: auf der speziellen Verwendungszwecke angeben.

Wenn Sie die Datei direkt aufgenommen werden Sie es mit std Präfix gezwungen werden ::. Die Frage ist also, welche Option würden Sie in diesem Fall nehmen. Was würden Sie von Boost eingeführt mit den anderen Typen tun? Würden Sie sie mit boost :: Präfix oder nicht?

Die Faust ist eindeutig eine schlechte Option. Sie können Option zwei mit Ihrer my_cstdint.hpp Datei implementieren

#include <boost/cstdint.hpp>

using boost::uint32_t;
...

und umfasst my_cstdint.hpp in Ihrer Anwendung. Aber meiner Meinung nach ist es eine schlechte Idee ist es, neue Symbole auf dem Root-Namespace hinzufügen, können Sie mehr Konflikte zu bekommen, wie die Typen können bereits durch zum Beispiel der stdint.h C-Datei definiert werden.

Auch wenn die dritte Option, um eine Menge von Zeichen verwendet, ist Namensraum für diesen Zweck gibt. boost :: uint32_t wird auf die richtige Art definiert werden, abhängig von Ihrem Toolset, so verwenden sie nur, wie Sie std :: würde uint32_t.

ich persönlich immer Option 3. Wenn die Dinge zu lange, dann können Sie typedefs verwenden, um die Menge an Code zu reduzieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top