2010-04-25 16 views
5

La implementación del estándar C99 de Boost es tremendamente útil. Una cosa me molesta, sin embargo. Vuelcan todos sus typedefs en el boost namespace. Esto me deja con tres opciones cuando se utiliza esta instalación:Uso "cstdint" de Boost

  1. Uso "using namespace boost"
  2. Uso "using boost::[u]<type><width>_t"
  3. explícitamente se refieren al tipo de destino con el prefijo boost::; por ejemplo, boost::uint32_t foo = 0;

  • Opción № 1 tipo de derrotas el punto de espacios de nombres. Incluso si se utiliza dentro del alcance local (por ejemplo, dentro de una función), cosas como los argumentos de funciones todavía tienen que estar prefijados como la opción № 3.
  • Opción № 2 es mejor, pero hay muchos tipos de estos, por lo que puede obtener ruidoso.
  • Opción № 3 agrega un nivel extremo de ruido; el prefijo boost:: suele ser ≥ a la longitud del tipo en cuestión.

Mi pregunta es: ¿Cuál sería la forma más elegante de llevar todos estos tipos en el espacio de nombres global? ¿Debo simplemente escribir un contenedor alrededor del boost/cstdint.hpp que utiliza la opción № 2 y terminarlo?


Además, envolviendo la cabecera como tal no funcionaba en VC++ 10 (problemas con los encabezados de biblioteca estándar):

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

    namespace boost_alias = boost; 
} 

using namespace Foo::boost_alias; 

EDIT: Creo que otra opción es utilizar el preprocesador para que funcione en VC 10? Tomando el fragmento de arriba:

#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 

Menos trabajo, supongo?

+0

posible duplicado de http://stackoverflow.com/questions/1481733/portable-c-03-exact-width-types –

+0

guión @gf: ingenioso, gracias. – patt0h

+0

¿Por qué necesita * todos * estos tipos? A menudo uso uno o dos de ellos, pero no recuerdo haberlos necesitado todos. – jalf

Respuesta

5

Acabo de usar C99 stdint.h (en realidad ahora está en VS 2010).Para las versiones de Visual C/C++ que no lo incluya, utilizo una versión de dominio público de MinGW que he modificado para trabajar con VC6 (desde el momento en que tenía que trabajar en VC6):

Hay un par de otras opciones que se pueden considerar en esta cuestión de forma: C99 stdint.h header and MS Visual Studio

Si desea seguir utilizando boost/cstdint.hpp, yo diría que la sugerencia de la aplicación de una cabecera de contenedor que trae en los tipos el espacio de nombres global sería el camino a seguir.

¿El boost/cstdint.hpp proporciona algo que yo debería saber que no está en stdint.h?

+0

Re: cstdint.hpp vs stdint.h - Creo que la única diferencia es que cstdint.hpp puede o no incluir los tipos de 64 bits y las macros asociadas, ya que long long aún no es estándar. Aparte de eso, quería usar la versión de boost porque ya tengo varias dependencias de impulso en mi proyecto. No tenía sentido distribuir un encabezado adicional en ese caso. – patt0h

1

Personalmente siempre uso la opción 3. Si las cosas son demasiado largas, puede usar typedefs para reducir la cantidad de código.

2

Su idea de escribir un encabezado contenedor que implemente la opción 2 es definitivamente la mejor de esas tres opciones.

Lo que sugeriría, sin embargo, es una pequeña variante: poner esas declaraciones using dentro de otro espacio de nombres, como cstdint o algo así; luego, tiene la opción de poner using cstdint; en su propio código o especificar explícitamente cstdint:: en los usos particulares.

2

Si incluyó directamente el archivo se verá obligado a prefijarlo con std ::. Entonces la pregunta es, ¿qué opción tomarías en este caso? ¿Qué harías con los otros tipos introducidos por Boost? ¿Los prefijarías con boost :: o no?

El primero es claramente una mala opción. Puede implementar la segunda opción utilizando el archivo de my_cstdint.hpp

#include <boost/cstdint.hpp> 

using boost::uint32_t; 
... 

e incluyen my_cstdint.hpp en su aplicación. Pero en mi opinión, es una mala idea agregar nuevos símbolos en el espacio de nombres raíz, puede obtener más conflictos ya que los tipos ya pueden definirse, por ejemplo, mediante el archivo stdint.h C.

Incluso si la tercera opción usa muchos caracteres, los espacios de nombres están ahí para este propósito. boost :: uint32_t se definirá con el tipo correcto según su conjunto de herramientas, así que simplemente úselo, como usaría std :: uint32_t.

+0

Pero puede hacerlo y agregar las declaraciones de uso al espacio de nombres de su proyecto en lugar de a la raíz. (Todo el mundo utiliza un espacio de nombres específico para el proyecto, ¿verdad? Si no lo hace, probablemente no le importe contaminar el espacio de nombres raíz de todos modos). –

Cuestiones relacionadas