Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Diferencia entre #define y const en c++

Estas en el tema de Diferencia entre #define y const en c++ en el foro de C/C++ en Foros del Web. Hola amigos, He visto que algunos usan #define y otros const en c++ para definir constantes, me gustaría saber si existe alguna diferencia que se ...
  #1 (permalink)  
Antiguo 06/11/2015, 11:51
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 10 años, 4 meses
Puntos: 1
Diferencia entre #define y const en c++

Hola amigos,

He visto que algunos usan #define y otros const en c++ para definir constantes, me gustaría saber si existe alguna diferencia que se puede apreciar, pues he leído que si tienen diferencias pero en las pruebas que he hecho el comportamiento es el mismo.

Saludos,
  #2 (permalink)  
Antiguo 06/11/2015, 13:10
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Diferencia entre #define y const en c++

#define es una directiva del precompilador, cuando va a compilar automáticamente cada vez que se encuentre el nombre que le has dado a la macro la sustituirá por el valor correspondiente.

const es una variable real del lenguaje, tiene su propia dirección de memoria asignada, está limitada a su ámbito local y puedes realizar operaciones como de una variable se tratase.

Así pues, en mi opinión es mejor utilizar const (si utilizas c++11 o 14 acostúmbrate también a utilizar constexpr), aunque si tienes un motivo justificado para usar la macro no pongo ninguna objeción, por los siguientes motivos:

1-Ámbito local
Cuando pones una variable const está variable queda limitada a la función o declaración en la que ha sido creada (en definitiva entre los últimos {}). Sin embargo cuando tu haces la macro con #define. Desde que es leído absolutamente todo valor con ese nombre es cambiado automáticamente antes de compilar.

2-Mayor facilidad para detectar errores
Cuando tu utilizas la macro automáticamente sustituyes antes de compilar, lo cual puede dificultar comprender el error que el compilador te muestre en caso de que lo haya. Además a la hora de depurar dispones de una variable para poder comprobaciones que créeme, es algo realmente útil.

En definitiva, si bien es cierto que tienen un coste de eficiencia ligeramente mayor usar const (o incluso ninguno ya que los compiladores tienen muchas posibilidades para optimizar código con const) que utilizar #define, const te va a dar una mayor versatilidad y, bajo mi opinión, un código más versátil y su potencial de causar errores a la hora de programar es mucho menor.
  #3 (permalink)  
Antiguo 06/11/2015, 14:00
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Diferencia entre #define y const en c++

Hola, muchas gracias por tu respuesta. Ha sido muy clara. Pero tengo dos dudas más:

Me podrías comentar que ventajas tiene el constexpr?

Cita:
Iniciado por xKuZz Ver Mensaje
Así pues, en mi opinión es mejor utilizar const (si utilizas c++11 o 14 acostúmbrate también a utilizar constexpr)
Y cómo saber qué versión de c++ estoy usando, me explico tengo VisualStudio 2013 que es el IDE con el que trabajo, tengo entendido que tiene ya incluido el c++11 pero no sé como comprobarlo.

Saludos,
  #4 (permalink)  
Antiguo 06/11/2015, 14:58
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Diferencia entre #define y const en c++

Creo que el compilador que trae por defecto vs13 soporta algunas cosas de C++11, en concreto los constexpr creo que no. No obstante, es cuestión de probar o buscar por internet.

constexpr hace que la expresión se intente dejar resuelta en tiempo de compilación (En caso de ser imposible, no pasa nada se resuelve en tiempo de ejecución). No es necesario abusar de esto pero permite resolver algunas limitaciones propias del lenguaje. Voy a poner el ejemplo más simple que se me ocurra. Esto es puramente un ejemplo las posibilidades que te ofrece esto son extremadamente grandes. Esto puede ser aplicado tanto a variables, como a funciones (bajo ciertas condiciones) o a objetos.

El ejemplo más simple:
Código C++:
Ver original
  1. // VLA- Para declarar un array de los de toda la vida, el índice debe ser conocido en tiempo de compilación. Aunque algunos compiladores den soporte a esto, en C++ está fuera del estándar hacer lo siguiente
  2. #include<limits>
  3. void incorrecto(){
  4. const int indice=std::numeric_limits<int>::max();
  5. int vla[indice]; // Al compilar desconozco su valor. Incorrecto.
  6. }
  7.  
  8. void correcto(){
  9. constexpr=std::numeric_limits<int>::max(); // Al compilar le da un valor
  10. int vla[indice]; // Correcto.
  11. }

Te dejo aquí algunos artículos que te pueden ser útiles si te interesa el tema (están en inglés):

http://www.cprogramming.com/c++11/c+...constexpr.html
http://www.codeproject.com/Articles/...s-in-Cplusplus

Etiquetas: const, define
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:08.