2010-07-09 19 views

Respuesta

17

macros son manejados por el pre-procesador - el pre-procesador es la sustitución de texto en el archivo de origen, reemplazando todas las ocurrencias de 'A' con los literales 8.

Constantes son manejados por el compilador. Tienen el beneficio adicional de la seguridad tipo.

Para el código compilado real, con cualquier compilador moderno, debe haber cero diferencia de rendimiento entre los dos.

+1

'no debe haber diferencia de rendimiento entre los dos' - Gracias por dejarlo tan claro.Momentos antes de leer en un libro miserable que tengo que dice que este último es más lento que el uso de la macro. –

+0

Pero el uso de macros a veces puede aumentar el tamaño del archivo objeto. Supongamos que tiene una cadena muy grande almacenada en una macro, el preprocesador reemplazará toda la ocurrencia de esta cadena por su valor antes de la compilación, lo que resulta en un archivo de objeto comparativamente más grande. – shashwat

1

Por un lado, la primera hará que el preprocesador para reemplazar todas las apariciones de A con 8 antes de que el compilador no nada mientras que el segundo no implica el preprocesador

1

Puede escribir

#define A 8 
int arr[A]; 

pero no

const int A = 8; 
int arr[A]; 

si recuerdo las reglas correctamente.

+2

No, ambos funcionarán. – Michael

+1

@Michael: No, al menos no si se usa gcc. "foo.c: 2: error: 'arr' variablemente modificado en el alcance del archivo" – swegi

+0

Tiene razón. Me perdí la etiqueta C en la pregunta. Lo que dije es cierto para C++. – Michael

5

Las constantes definidas en macro se reemplazan por el preprocesador. Las 'variables' constantes se administran como las variables regulares.

Por ejemplo, el siguiente código:

#define A 8 
int b = A + 10; 

aparecería al compilador real,

int b = 8 + 10; 

Sin embargo, este código:

const int A = 8; 
int b = A + 10; 

aparecería como:

const int A = 8; 
int b = A + 10; 

:)

En la práctica, la cosa principal que cambia es alcance: las variables constantes obedecen a las mismas reglas de alcance como variables estándar en C, lo que significa que se pueden restringir, o posiblemente redefinidas, dentro de un bloque específico, sin se está filtrando - es similar a la situación de variables locales vs. globales.

Cuestiones relacionadas