Initialisation de la structure C avec variable

J’ai rencontré un problème qui, semble-t-il, ne fait l’object d’aucune norme C après C89, à l’exception de la suppression des limites d’initialisation des structures. Cependant, une erreur s’est produite lors de l’utilisation de l’IDE Open Watcom (pour le débogage), où le compilateur indique que l’initialiseur doit être une expression constante.

Voici l’essentiel de ce qui se passe.

typedef struct{ short x; short y; } POINT; void foo( short x, short y ) { POINT here = { x, y }; /* <-- This is generating the error for the compiler */ /* ... */ } 

Des idées pourquoi, ou quelle norme interdit cela?

La citation suivante est tirée de l’ argumentaire C99 :

Le Comité C89 a examiné les propositions tendant à autoriser les initialiseurs d’agrégats automatiques à se composer d’une série d’expressions arbitraires au moment de l’exécution, délimitées par des accolades, au lieu de celles utilisables comme initialiseurs statiques à la traduction. Plutôt que de définir un ensemble de règles qui éviteraient les cas pathologiques tout en ne semblant pas trop arbitraires, le Comité C89 a choisi de n’autoriser que les initialiseurs statiques. Cela a été reconsidéré et les expressions à l’exécution sont valides dans C99.

Le problème est que C n’est pas un langage object et ne fait que du typage ssortingct. De plus, C maintient une différence entre les structures et les tableaux.

La façon dont votre code devra fonctionner est

 void foo( short x, short y ) { POINT here; here.x = x; here.y = y; } 

Ceci est normal pour C89 … les initialiseurs doivent être constants, c.-à-d. capable d’être déterminé au moment de la compilation. Cela signifie qu’il n’y a pas de variables dans les initialiseurs, ce qui vaut également pour les autres types, pas seulement les structures. En C99, votre code fonctionnerait.