c++ - funcion - define vs const
¿Cuál es la diferencia entre#define y const? (6)
Posibles duplicados:
¿Por qué alguien usaría #define para definir constantes?
diferencia entre una macro y una const en c ++
C ++ - enum vs. const vs. #define
¿Cuál es la diferencia entre usar #define
y const
para crear una constante? ¿Alguien tiene una ventaja de rendimiento sobre el otro? Naturalmente prefiero usar el const
pero voy a considerar el #define
si tiene las ventajas adecuadas.
DEFINE es la instrucción Preprocessor, por ejemplo #define x 5. El compilador toma este valor e inserta donde sea que esté llamando x en el programa y genere el archivo objeto. Definir constantes no crea una entrada de símbolo en la tabla de símbolos. SI quiere depurar el programa, no encontrará x. Use constante siempre que sea posible que lo que pienso.
La diferencia es que #define es procesado por el preprocesador haciendo lo que equivale a una simple sustitución de texto. Los valores de Const definidos de esta manera no son visibles para el compilador real, mientras que una variable definida con el modificador de const es una "variable" realmente tipada (bueno, realmente no es esa variable). La desventaja de #define es que reemplaza cada ocurrencia del nombre, mientras que las variables const obtienen una búsqueda normal, por lo que tiene menos riesgo de nombrar conflictos y no es seguro.
La ventaja de #define es que garantiza la consistencia y, por lo tanto, no habrá una variable de respaldo. Las variables de Const pueden o no ser sustituidas en el código, por lo que #define puede ser más rápido en algunas situaciones. Sin embargo, un buen compilador debe alinear esas constelaciones de todos modos y es poco probable que haga una gran diferencia en la mayoría de las situaciones, así que seguiría usando const a menos que tenga un fragmento de código donde haya visto que el compilador no ha insertado la variable y es un código muy, muy crítico para el rendimiento.
La directiva #define
es una directiva de preprocesador ; el preprocesador reemplaza esas macros por su cuerpo antes de que el compilador lo vea. Piense en ello como una búsqueda y reemplazo automáticos de su código fuente.
Una declaración de variable const declara una variable real en el idioma, que puede usar ... bueno, como una variable real: tomar su dirección, pasarla, usar cast, convertirla, etc.
Oh, rendimiento: quizás piense que evitar la declaración de una variable ahorra tiempo y espacio, pero con cualquier nivel de optimización del compilador razonable no habrá diferencia, ya que los valores constantes ya están sustituidos y plegados en tiempo de compilación. Pero obtienes la gran ventaja de verificar los tipos y hacer que tu código sea conocido por el depurador, por lo que realmente no hay ninguna razón para no usar las variables de const.
#define AB
le dice al preprocesador (una parte del compilador) que sustituya B
lugar donde ve A
en el código, y lo hace antes de compilar el código. Podría (aunque es una idea terrible) hacer algo como #define FALSE TRUE
.
Una variable const significa que una vez que se establece la variable no se puede cambiar, sin embargo, no hace nada con el preprocesador y está sujeta a las reglas normales de las variables.
#define
crea una entidad para la sustitución por el macropreprocesador, que es bastante diferente de una constante porque, dependiendo de lo que definas, se tratará o no como una constante. El contenido de un #define puede ser arbitrariamente complejo, el ejemplo clásico es el siguiente:
#define SQR(x) (x)*(x)
Luego más tarde si se usa:
SQR(2+3*4)
Eso se convertiría en:
(2+3*4)*(2+3*4)
#define
es un reemplazo de texto, por lo que es tan rápido como puede obtenerse. Además, garantiza constness. La desventaja es que no es seguro para tipos.
Por otro lado, las variables const
pueden o no reemplazarse en línea en el código. Puede descartar la constness, forzándola a estar en la memoria (aunque probablemente se encuentre en la memoria de solo lectura para empezar, pero hay dolores de cabeza en ambos sentidos). Sin embargo, se garantiza que es seguro, ya que lleva consigo su propio tipo.
Personalmente recomendaría const
para aclarar tu intención.