2009-07-06 38 views
42

Si tengo una declaración #define dentro de un espacio de nombres, tales como:declaraciones #define dentro de un espacio de nombres

namespace MyNamespace 
{ 
    #define SOME_VALUE 0xDEADBABE 
} 

Estoy en lo correcto al decir que la declaración #define no se limita al espacio de nombres?

¿Lo siguiente es lo "correcto" para hacer?

namespace MyNamespace 
{ 
    const unsigned int SOME_VALUE = 0xDEADBABE; 
} 
+3

Correcto en ambos casos. –

Respuesta

54

Correcto, #define no están vinculados por espacios de nombres. #define es una directiva preprocessor - resulta en la manipulación del archivo fuente antes de ser compilado a través del compilador. Los espacios de nombres se usan durante el paso de compilación y el compilador no tiene ninguna idea de los #define.

Debe intentar evitar el preprocesador tanto como sea posible. Para valores constantes como este, prefiera const sobre #define.

+1

+1 - su última declaración me recuerda a C++ eficaz –

+1

constexpr es el equivalente más apropiado de # define expresión de valor de constatnt – jaskmar

3

Sí. En general, usar valores de const en lugar de # valores definidos tiene muchas ventajas. Restringir el alcance de la variable es una de las ventajas. El alcance puede restringirse a un espacio de nombres, o a cualquier otro ámbito válido de esta manera (incluso a nivel de clase, nivel de función, etc.).

4

El preprocesador funciona (al menos conceptualmente, ya menudo en realidad demasiado) antes de espacios de nombres y otros conceptos a nivel de lenguaje "patada en" - así que sí, es definitivamentemucho mejor utilizar construcciones de nivel de idioma como const valores donde sea que puedas!

0

Si, por alguna razón, no podría cambiar al segundo caso, estoy bastante seguro de que tendría que tener cuidado de compilar MyNamespace en su propio objeto y vincular los objetos por separado (o posiblemente simplemente ejecutar el preprocesador en ese espacio de nombres único por sí mismo). El preprocesador C++ debe tomar esa declaración #define y esencialmente hacer una cadena reemplazar en cualquier lugar que SOME_VALUE se ve en el código fuente. Por lo tanto, si el preprocesador no conoce el #define, SOME_VALUE no se puede reemplazar en otro archivo fuente.

18

Estoy completamente de acuerdo con las sugerencias sobre el uso de constantes y el alcance es ilimitado para #define s.

Sin embargo, si hacer tienen que utilizar preprocesador #define líneas, por favor cubrirlas correctamente para el alcance esperado,

namespace MyNamespace 
{ 
    #define SOME_VALUE 0xDEADBABE 
    // your code 
    #undef SOME_VALUE 
} 

Por qué #defines?
Conozco un caso en el que una plataforma incrustada no admite constantes en el código.
No había forma de inicializarlos ...
Siempre ayuda a ser más legible.

Cuestiones relacionadas