2012-06-18 13 views
6

No puedo entender lo que es la diferencia entre:#Define VS variable

#define WIDTH 10 

y

int width = 10; 

¿Cuáles son los beneficios del uso de la primera o la segunda?

+0

Lea [este] (http://stackoverflow.com/questions/1674032/static-const-vs-define-in-c) pregunta también – gahcep

Respuesta

4

Bueno, hay una gran diferencia. Puede cambiar el valor de width, puede tomar su dirección, puede solicitar su tamaño, etc. Con WIDTH, se reemplazará por una constante 10 en todas partes, por lo que la expresión ++WIDTH no tiene ningún sentido. Ono al otro lado, puede declarar una matriz con WIDTH elementos, mientras que no puede declarar una matriz con width elementos.

En resumen: el valor de WIDTH es conocido en tiempo de compilación y no se puede cambiar. El compilador no asigna memoria para WIDTH. Por el contrario, width es una variable con inicial valor 10, sus valores adicionales no se conocen en tiempo de compilación; la variable obtiene su memoria del compilador.

+0

por lo que el ANCHO macro no se puede cambiar y que se utiliza para indicar algo "clásico" en el programa? # Define como autor "yo" ?? – Rrjrjtlokrthjji

+1

@Nick: las macros se pueden usar de miles de maneras diferentes. Puede definir macro para contener un fragmento de código: '#define CHECKSUCCESS (n) if (n) return n; else {} '. La forma en que propone es un uso válido también. – Vlad

+0

@ Nick: Por cierto, con macros se pueden hacer cosas extrañas, como 'pecado #define (x) cos (x)'! Use con cuidado. – Vlad

2

WIDTH es una macro que será reemplazada con el valor (10) por preprocessor mientras que width es una variable.

Cuando defina una macro (como ANCHO aquí), el preprocesador simplemente realizará un reemplazo de texto antes de pasar el programa al compilador. es decir, donde sea que haya usado WIDTH en su código, simplemente será reemplazado por 10.

Pero cuando lo hace int width=10, la variable está vivo

+0

todavía no lo entiendo. ¿Podría explicarlo mejor? – Rrjrjtlokrthjji

+0

@ Nick actualiza ahora .. –

+1

@ Nick espero que usted es nuevo en la programación C, prefiero sugerir que usted vaya a través del libro. – Viswesn

0

En primer lugar un breve fondo: antes de conseguir compilado, un archivo C es pre-procesado. El preprocesador comprueba las declaraciones #include y #define.

En su caso, declaración de que #define cuenta la pre-procesador de cambiar cada cuerda WIDTH en su código fuente con la cadena 10. Cuando el archivo obtiene compilado en el siguiente paso, cada aparición de WIDTH será de hecho 10. Ahora, la diferencia entre

#define WIDTH 10 

y

int width = 10; 

es que el primero puede ser visto como un valor constant, mientras que la segunda es una variable normal cuyo valor puede ser cambiado.

+0

'const' parece haber estado allí desde C89. – nhahtdh

7

¿Cuál es la diferencia entre dos?

El primero es un Macro mientras que el segundo es una declaración de variables.

#define WIDTH 10 es una preprocessor directive que le permite especificar un nombre (WIDTH) y su texto de reemplazo (10). El preprocesador analiza el archivo fuente y cada aparición del nombre se reemplaza por su texto asociado. El compilador nunca ve realmente un nombre de macro, lo que ve es el texto reemplazado.

La declaración de la variable es evaluada por el propio compilador. Le dice al compilador que declare una variable llamada width y del tipo int y también la inicializa con un valor 10.
El compilador conoce esta variable por su propio nombre width.

¿Cuál de todas prefiere? ¿Y por qué?

Normalmente, se recomienda utilizar variables constantes de tiempo de compilación sobre #define. así que su declaración de variables debe ser:

const int width = 10; 

Hay una serie de razones para la selección de compilar constantes de tiempo más #define, a saber:

Ámbito mecanismo basado en:

El alcance de #define está limitado al archivo en el que está definido. Por lo tanto, #defines que se crean en un archivo fuente son NOT disponibles en un archivo fuente diferente. En resumen, #define s no respetan los ámbitos. Tenga en cuenta que las variables const pueden ser delimitadas. Obedecen todas las reglas de alcance.


Evitar los números mágicos extraños durante los errores de compilación:

Si está utilizando #define aquellos se sustituyen por el pre-procesador en el momento de la compilación previa Así que si recibe un error durante la compilación, será confuso porque el mensaje de error no referirá el nombre de la macro sino el valor y aparecerá un valor repentino, y perderá mucho tiempo rastreándolo en el código.


Facilidad de depuración:

también por las mismas razones mencionadas en el # 2, mientras se depura #define proporcionaría ninguna ayuda realmente.

+0

Es un símbolo, no una macro. – Joey

+0

La pregunta está etiquetada 'c', ¿estás seguro de espacios de nombres y clases? – Vlad

+0

Una de las ventajas de DEFINE cuando se programa en sistemas embebidos es que DEFINE nunca consumirá memoria donde una variable deba almacenarse en alguna parte. – RedX

0

Una #define es manejado por el preprocesador, si encuentra WIDTH en el código fuente y lo reemplaza con 10, lo único que hace es la sustitución básica entre otras cosas, el otro int width = 10; es manejado por el compilador, esto creará entradas en la tabla de búsqueda, genera binarios para asignar suficiente memoria en la pila, dependiendo de su definición, y copia el valor 10 en esa ubicación de memoria.

Así que uno no es más que una etiqueta para una constante, el otro es una variable en tiempo de ejecución.

Usted puede utilizar preprocesadores para una ejecución más rápida, ya que las variables deben ser asignados en la pila, a costa de no ser mutable en tiempo de ejecución.

Por lo general, utiliza preprocesadores para cosas que no necesitan cambiar en tiempo de ejecución, aunque tenga cuidado de que los preprocesadores puedan ser un poco difíciles de depurar, ya que pueden manipular el código fuente antes de entregarlo al compilador, a errores muy sutiles, que pueden o no ser evidentes al examinar el código fuente.