Le compilateur Java possède une petite quantité de logique de flux pour vous permettre d'initialiser final
après leur déclaration. Ceci est légal en Java :
final int something;
if ( today == Friday )
something = 7;
else
something = 42;
Java détectera si une branche laisse la valeur finale indéfinie. Il n'analysera pas les conditions, donc ce n'est pas du Java légal, même si c'est logiquement similaire :
final int something;
if ( today == Friday )
something = 7;
if ( today != Friday )
something = 42;
Dans la norme ANSI C89, const
variables ( autres que extern
) doivent être initialisés dans la déclaration dans laquelle ils sont déclarés.
const int something = ( today == Friday ) ? 7 : 42;
En extern
sur une déclaration indique au compilateur que la variable est initialisée dans une unité de compilation différente (ou ailleurs dans cette unité de compilation).
En ANSI C99, vous pouvez mélanger les déclarations et le code, ainsi vous pouvez déclarer et initialiser un fichier const
après un bloc d'assertions et de code. La portabilité du C ANSI de 1999 reste un problème.
Une solution de contournement pour C89 consiste à noter que les règles relatives aux déclarations précédant le code s'appliquent à la portée du bloc plutôt qu'à celle de la fonction, ce qui vous permet de procéder ainsi :
#include<stdio.h>
int main ( void )
{
printf ( "wibble\n" );
{
const int x = 10;
printf ( "x = %d\n", x );
}
return 0;
}