2010-05-24 8 views
5

Para definir las constantes, ¿cuál es la forma más común y correcta? ¿Cuál es el costo, en términos de compilación, vinculación, etc., de definir constantes con #define? Es otra forma menos costosa?¿Cuál es el costo de un #define?

+0

Elija un idioma, cualquier idioma? –

+1

@Kyle: mira las etiquetas. – Cam

+1

C# no permite que '# define' se use para definir constantes. Puede hacer '#define DEBUG', pero no' #define DEBUG 1'. http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx –

Respuesta

14

La mejor manera de definir cualquier const es escribir

const int m = 7; 
const float pi = 3.1415926f; 
const char x = 'F'; 

Usando #define es un mal estilo ++ c. Es imposible ocultar #define en el ámbito del espacio de nombres.

Compare

#define pi 3.1415926 

con

namespace myscope { 
const float pi = 3.1415926f; 
} 

segunda forma es obviamente mejor.

+2

+1 '# define' también es un estilo pobre porque no proporciona ninguna información de tipo explícita al compilador. – GrahamS

+2

Esto resume con precisión las recomendaciones estilísticas pero no responde la pregunta. Las constantes declaradas en el estilo correcto de C++ tienen un costo que #defines no tienen. –

+1

@Dan Olson: Aah pero #defines también tienen un costo en términos de tamaño del código, ya que (dependiendo de la inteligencia del compilador) puedes terminar introduciendo muchos literales donde hubiera sido un const individual. @Espuz: ninguno de los costos vale la pena preocuparse (a menos que esté haciendo cosas de microprocesador de muy bajo nivel), así que vaya con el mejor estilo, que es 'const' siempre que sea posible. – GrahamS

2

El costo es solo para el preprocesador, cuando #defines se resuelven (ignorando el costo adicional de depuración de tratar con un proyecto lleno de #defines para constantes, por supuesto).

0

#define es un reemplazo de cadena. Entonces, si comete errores en las macros, aparecerán como errores más adelante. La mayoría de los tipos incorrectos o expresiones incorrectas son los más comunes.

Para la compilación condicional, las macros del preprocesador funcionan mejor. Para otras constantes que se utilizarán en el cálculo, const funciona bien.

1

#define Las macros son procesadas por el preprocesador, no son visibles para el compilador. Y dado que no son visibles para el compilador como un símbolo, es difícil depurar algo que involucra una macro.

La forma preferida de definir las constantes es usar la palabra clave const junto con la información de tipo adecuada.

const unsigned int ArraySize = 100; 

Aún mejor es

static const unsigned int ArraySize = 100; 

cuando la constante se utiliza sólo en un único archivo.

1

#define aumentará el tiempo de compilación pero lo hará más rápido en la ejecución ...

generalmente en #define compilación condicional se utiliza ...

donde const se utiliza en el cálculo general de los números

La elección depende de su requisito ...

+1

En el mejor de los casos, el aumento de velocidad con #define será marginal. Si el compilador optimiza las ventajas no habrá ninguna ventaja y perderá todos los beneficios de const. – JeremyP

+0

sí ... #define es útil en la compilación condicional (en aplicaciones multiplataforma ...) Es la única ventaja que se puede considerar ... –

5

El compilador nunca ve un #define. El preprocesador expande todas las macros antes de pasarlas al compilador. Uno de los efectos secundarios, sin embargo, es que los valores se repiten ... y dos cadenas idénticas no son necesariamente la misma cadena exacta. Si usted dice

#define SOME_STRING "Just an example" 

es perfectamente legal para el compilador para añadir una copia de la cadena en el fichero de salida cada vez que se ve la cadena. Un buen compilador probablemente elimine los literales duplicados, pero eso es trabajo extra que tiene que hacer. Si usa un const en su lugar, el compilador no tiene que preocuparse tanto por eso.

0

El tiempo de CPU no es realmente el costo de usar #define o macros. El "costo" como desarrollador es el siguiente:

  • Si hay un error en la macro, el compilador lo marcará donde hizo referencia a la macro, no donde la definió.
  • Perderá seguridad de tipo y alcance para su macro.
  • Las herramientas de depuración no conocerán el valor de la macro.

Estos elementos pueden no grabar los ciclos de CPU, pero pueden quemar ciclos de desarrollador.

Para las constantes, es preferible declarar las variables const, y para las funciones poco independientes del tipo, son preferibles las funciones en línea y las plantillas.

Cuestiones relacionadas