2010-08-07 13 views

Respuesta

12

No utilice const variables para las ¡esta! En el lenguaje C, una variable calificada const es no una constante en el sentido de expresión constante, por lo que no se puede usar para inicializar una variable estática/global. Esto tiene importantes consecuencias prácticas; por ejemplo, lo siguiente no funciona:

static const double powers_of_pi[] = { 1, PI, PI*PI, PI*PI*PI, PI*PI*PI*PI, }; 

La solución apropiada es #define. Probablemente sea mejor utilizar el sufijo l para que tengan el tipo long double, e incluir suficientes decimales que los valores serán correctos para los tipos long double de hasta 128 bits. Entonces puede usarlos donde sea que se espere cualquier tipo de punto flotante; C los convertirá silenciosamente a una precisión menor según sea necesario.

+3

+1: C const son basura. Por ejemplo, ni siquiera puede hacer esto: 'static const double pi = 3.1415926; static const double tau = 2 * pi; 'porque en C const los inicializadores siempre tienen que ser constantes de compilación, que pi no es. –

+1

Gracias por su apoyo, inyectando cordura en este tema. Parece que todos los demás provienen de un fondo de C++ y piensan que lo que funciona en C++ debería funcionar en C ... :-( –

+0

@Luther, no deberían llamarlos basura. Tienen su uso limitado, pero ciertamente no es el de alguien. que viene de un fondo C++ espera. 'const' nunca debería haber sido elegido como la palabra clave para lo que está parado,' unmutable' o algo así habría sido mucho más sensato, para ambos, C y C++. –

10

Ninguno de ellos, utilizan valores constantes para preservar la comprobación de tipos del compilador:

static const double PI = 3.14159265; 
static const double SPEEDOFLIGHT = 2.99792458e8; 
  • El #define es sólo el reemplazo de texto y el tipo inconsciente.
  • Las enumeraciones no son adecuadas para todos los tipos. No estoy seguro, pero creo que ni siquiera para los valores double.

EDIT: gracias aaa. Olvidé la palabra clave static, especialmente útil cuando las constantes se declaran en encabezados c. (En C++ la estática no es necesaria)

+1

probablemente deberían hacerlos estáticos para evitar errores del enlazador – Anycorn

+0

static const double es entonces, ¡gracias chicos! –

+5

Este es un muy mal consejo. Por ejemplo, no podrá usar expresiones que involucren 'PI' como inicializadores para datos estáticos. –

3

Dado que enum's son entero constantes, me gustaría ir con #define.

Estoy de acuerdo con jdehaan que los objetos globales const son incluso mejores.

+2

Felicitaciones por ser la única respuesta para mencionar explícitamente que 'enum' es solo para tipos enteros, pero no estoy de acuerdo en que los objetos' const' globales sean mejores (al menos no sin mencionar sus limitaciones). – jamesdlin

1

De acuerdo con jdehaan, prefiera las constantes para hacer una comprobación/conversión de tipos más explícita.

Además, usar una enumeración como la que describió no es realmente el propósito de una enumeración. Esas constantes solo están relacionadas matemáticamente (si el cosmólogo hocus-pocus termina siendo el correcto). El propósito de una enumeración es combinar como valores, como:

enum color 
{ 
    red = 0xFF0000; 
    yellow = 0xFFFF00; 
    baby_puke_green = 0x9ACD32; 
} 
5

personalmente prefiero hacer sólo pi y c = 1 y permitir que el acuerdo universo con el problema

+2

O normalizar :) –