Kevin Kofler (./173) :
-> erreur (pas le droit de sauter dans la portée d'un VLA).
Ben oui. Mais ca le fait aussi sur les goto:
void f(int foo) {
if (foo != 1)
goto l2;
l1: ;
int n=3;
int x[n];
l2:
}
Mais à mon avis ca n'a rien à voir. Car on a la même chose avec le code suivant qui est clean:
if (error)
goto handle_error;
...
handle_error: ;
int my_error = errno;
...
Pour moi, c'est une lacune de la norme C.
Kevin Kofler (./173) :
Et pourquoi utilises-tu encore ce switch qui sert uniquement au portage de vieilles sources K&R? Pourquoi à ton avis ce switch n'est-il pas inclus dans -Wall ni -Wextra?
Parce que je veux que chacune de mes fonctions soit parfaitement prototypée ?
Pour le second point, je ne sais pas, mais je sais que bon nombre de projets le rajoute.
Kevin Kofler (./173) :
Fais un cast explicit vers (const int (*)[ 3]), c'est plus propre que ton aliasing violation.
C'est moins comode car si la taille de T augmente, où son type, tu dois corriger tous les cast.
Mais c'est encore une lacune de la norme C.
JackosKing (./176) :
?
Pour int T[ 3][3 ], T sera passé automatiquement par pointeur à chaque appel de fonction (ce qui fait qu'un const est indispensable pour bien éviter que la fonction appelée ne modifie les entrées).
Si tu fais un struct { }, ca sera passé par copie sur la pile ==> Il faut donc modifier le prototype pour le passer par pointeur f(const T * const x)
Tiens encore un truc en C:
#include <string.h>
typedef int T[3][3];
void f( T *x)
{
memset (x[0], 0, sizeof (x[0]));
memset (x[1], 0xAF, sizeof (x[1]));
memset (x[2], 0x6D, sizeof (x[2]));
}
Ce code est buggué. Pourquoi ?