Question

Boost C99 la mise en œuvre de stdint de est terriblement pratique. Une chose bugs moi, cependant. Ils déversent tous leurs typedefs dans le boost namespace. Cela me laisse avec trois choix lors de l'utilisation de cette installation:

  1. Utilisez "using namespace boost"
  2. Utilisez "using boost::[u]<type><width>_t"
  3. font explicitement référence au type cible avec le préfixe boost::; par exemple, boost::uint32_t foo = 0;

  • Option ? 1 type de défaites le point de namespaces. Même si elles sont utilisées dans la portée locale (par exemple, dans une fonction), des choses comme arguments de la fonction doivent encore être préfixé comme l'option ? 3.
  • Option 2 est mieux ?, mais il y a un tas de ces types, donc il peut être bruyant.
  • Option 3 ajoute un ? niveau extrême de bruit; le préfixe boost:: est souvent = à la longueur du type en question.

Ma question est: Quelle serait la façon la plus élégante de réunir tous ces types dans l'espace de noms global? Dois-je écrire juste un wrapper autour boost/cstdint.hpp qui utilise l'option 2 et être ? fait avec elle?


En outre, l'en-tête enveloppant comme n'a donc pas le travail sur VC ++ 10 (problèmes avec les en-têtes de la bibliothèque standard):

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

  namespace boost_alias = boost;
}

using namespace Foo::boost_alias;

EDIT: Je suppose une autre option est d'utiliser le préprocesseur pour le faire fonctionner sur VC 10? Prendre l'extrait ci-dessus:

#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

Moins de travail, je suppose?

Était-ce utile?

La solution

Je viens d'utiliser la stdint.h de C99 (il est en fait maintenant dans VS 2010). Pour les versions de Visual C / C ++ qui ne comprennent pas, j'utiliser une version de domaine public de MinGW que j'ai modifié à travailler avec VC6 (du temps où je devais travailler dans VC6):

Il y a quelques autres options que vous pourriez envisager dans cette question SO: C99 stdint.h tête et MS Visual studio

Si vous souhaitez continuer à utiliser boost/cstdint.hpp, je dirais que la suggestion de mettre en œuvre un en-tête d'emballage qui apporte les types dans l'espace de noms global serait la voie à suivre.

Est-ce que boost/cstdint.hpp fournir tout ce que je devrais savoir à ce sujet n'est pas stdint.h?

Autres conseils

Votre idée d'écrire un en-tête d'emballage qui implémente l'option 2 est sans aucun doute le meilleur de ces trois options.

Ce que je suggère, cependant, est une légère variante: Mettez ces déclarations using dans un autre espace de noms, tels que cstdint ou quelque chose; puis, vous avez la possibilité de mettre si using cstdint; dans votre propre code ou en spécifiant explicitement cstdint:: sur les utilisations particulières.

Si vous avez inclus directement le fichier sera obligé de le préfixe avec std ::. La question est, quelle option prendriez-vous dans ce cas. Que feriez-vous avec les autres types introduits par Boost? Voulez-vous les préfixer avec boost :: ou non?

Le poing est clairement une mauvaise option. Vous pouvez mettre en œuvre l'option à deux en utilisant votre fichier my_cstdint.hpp

#include <boost/cstdint.hpp>

using boost::uint32_t;
...

et comprennent my_cstdint.hpp dans votre application. Mais à mon avis, il est une mauvaise idée d'ajouter de nouveaux symboles sur l'espace de noms racine, vous pouvez obtenir plus de conflits que les types peuvent être déjà définis par exemple le fichier stdint.h C.

Même si la troisième option d'utiliser un grand nombre de caractères, les espaces de noms sont là à cet effet. boost :: uint32_t sera défini le type correct en fonction de votre jeu d'outils, donc il suffit d'utiliser, comme vous utiliseriez std :: uint32_t.

Personnellement j'utilise toujours l'option 3. Si les choses sont trop longues, vous pouvez utiliser typedefs pour réduire la quantité de code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top