178Fermer180
PpHdLe 08/05/2008 à 09:48
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 ?