Erhöhung des „cstdint“ Usage
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:
- Verwenden Sie "
using namespace boost
" - Verwenden Sie "
using boost::[u]<type><width>_t
" - 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?
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.