El compilador Java tiene una pequeña cantidad de lógica de flujo para permitirle iniciar las variables final
después de su declaración.Esto es legal de Java:
final int something;
if (today == Friday)
something = 7;
else
something = 42;
Java detectará si las ramas salen del valor final definido. No va a analizar las condiciones, así que esto no es legal en Java, aunque es lógicamente similar:
final int something;
if (today == Friday)
something = 7;
if (today != Friday)
something = 42;
En ANSI C89, const
variables (que no sean extern
) debe ser inicializado en el estado en que se declaran en.
const int something = (today == Friday) ? 7 : 42;
el extern
modificador en una declaración indica al compilador que la variable se inicializa en una unidad de Complation diferente (o en otro lugar en esta unidad de compilación).
En ANSI C99, puede mezclar declaraciones y códigos, por lo que puede declarar e inicializar una variable const
después de un bloque de aserciones y códigos. La portabilidad de 1999 ANSI C sigue siendo un problema.
Un trabajo en torno a C89 es tener en cuenta que las normas para las declaraciones anteriores de trabajo de código en el ámbito de bloque en lugar de ámbito de la función, por lo que se puede hacer esto:
#include<stdio.h>
int main (void)
{
printf ("wibble\n");
{
const int x = 10;
printf ("x = %d\n", x);
}
return 0;
}
@Pete: 2x Lecciones aprendidas. –
En realidad, puede declarar variables const * global * no externas sin inicializarlas. 'const int a;' se llama una "definición tentativa", o algo así.Si la variable se define posteriormente sin ambigüedades, se trata como una simple declaración. Si no, es una definición. Entonces puede tener 'const int a;' en un encabezado, y luego 'const int a = 12;' en el archivo .c. No es que a menudo quieras, ya que te arriesgas a olvidar la definición y terminar con 'a' siendo 12 en algunas unidades de compilación y 0 en otras ... –
@onebyone: De hecho, las "definiciones tentativas" no conducen a diferentes valores en diferentes unidades de compilación. Intente compilar "int x;" en un archivo y "int x = 1;" en otro. La variable x contiene 1 en ambos archivos después del enlace (con todos los compiladores que probé). Este es el comportamiento ampliamente implementado, aunque no leo C99 como especificando exactamente esto. –