1

J'ai decouvert une nouvelle possibilite des extensions GNU : Construction d'une fonction de callback a la volee parce que ca fait chier de le faire autrement !
#include <stdlib.h>

void f(int *tab, int n, int c) {
  qsort (tab, n, sizeof(n), ({int cmp (int *a, int *b) { return *a < *b*c;}; &cmp;}));
}

int main () {
  int tab[] = {4,2,5,6,7,-25,59,75};
  int i;

  const int n = sizeof(tab)/sizeof(tab[0]);
  f(tab, n, -1);
  void g() {
    for (i = 0 ; i < n ; i ++)
      printf ("%d ", tab[i]);
    putchar ('\n');
  }
  g ();
  f(tab, sizeof(tab)/sizeof(tab[0]), 1);
  g ();
  return 0;
}


Je vous laisse imaginer ce que ca donne lorsqu'on mixe ca avec des __attribute__((cleanup)) ou __attribute__((destructor)). smile

2

Trop fort. GNU C accepte ceci :
int (*apply1 (int (*f) (const void *, const void *), void *a))(const void *)
{
  return ({int zozo(const void * b) { return f(a,b); }; &zozo; });
}

love Le code produit est juste invalide

3

Pour ./1, c'est vraiment censé marcher, et si oui, c'est parce qu'il se trouve que GCC l'implémente de la bonne manière et donc on a de la chance, ou parce qu'il y a une vraie spec derrière qui le garantit ? (par exemple en définissant une portée "type C++" pour les variables temporaires, ou en étendant cette portée au bloc qui entoure le statement)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

4

 If, however, the nested function does not refer to anything that has gone out of scope, you should be safe.

http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Nested-Functions.html#Nested-Functions

5

En gros, c'est "should be" et pas `be'. neutral

6

Et ça doit pas être une feature hyper utilisée de GCC, donc c'est le genre de truc qui peut casser subtilement sans qu'on s'en rende compte...

En fait c'est vraiment super mal spécifié, les extensions GNU, en général. C'est spécifié par l'implémentation et l'usage général, je trouve ça assez gore sick D'ailleurs les développeurs de g++ ont pris une position un peu plus saine à ce sujet smile

Et tiens d'ailleurs, je viens de tomber sur http://www.microsoft.com/mscorp/execmail/2005/02-03interoperability.asp :
Bill Gates
: Sometimes interoperability is also confused with open source software. Interoperability is about how different software systems work together. Open source is a methodology for licensing and/or developing software – that may or may not be interoperable.

pencil (même si venant de lui, c'est un peu l'hôpital qui se fout de la charité, vu l'intéropérabilité des produits MS tripaf)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

7

Premiere partie: les extensions GNU sont a classer en 3 parties : attribute, builtin (la c'est specifie) et le reste (la ca peut changer).
S'il l'enleve, je balance une regresssion de code c'est tout smile

Seconde partie: Rapport avec le sujet ?

8

Moi en tout cas je risque de l'utiliser bien souvent cette feature a la con grin

9

PpHd
: Premiere partie: les extensions GNU sont a classer en 3 parties : attribute, builtin (la c'est specifie) et le reste (la ca peut changer).

Oui, il y a des extensions utiles, évidemment : le genre de truc qui correspond aux extensions "traditionnelles" des compilateurs "traditionnels" (assembleur, contrôle de 2-3 trucs bas niveaux genre symboles employés par le linker, alignement, padding, etc...)

Certains builtins peuvent être utiles (constant_p, etc...), par contre les extensions de langage à proprement parler, c'est souvent bof...
S'il l'enleve, je balance une regresssion de code c'est tout smile

Je donnerai pas ma main à couper qu'ils soient prêts à se faire chier pour un type qui a utilisé une extension dans un cas un peu limite qui "devrait" marcher...
Seconde partie: Rapport avec le sujet ?

Bah un truc mal spécifié et défini seulement par l'implémentation (qui en plus est une usine à gaz, parce que RMS ne veut pas que les méchants capitalistes puissent écrire des backend/frontend propriétaires), c'est un bon exemple de truc qui ne favorise pas l'interopérabilité... Et qui montre bien que logiciel open-source est totalement orthogonal à logiciel interopérable...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

>Je donnerai pas ma main à couper qu'ils soient prêts à se faire chier pour un type qui a utilisé une extension dans un cas un peu limite qui "devrait" marcher...
dans ce cas, je le patch dans mon GCC.

>Et qui montre bien que logiciel open-source est totalement orthogonal à logiciel interopérable...
Et ? quoi de neuf ?

11

Pollux :
totalement orthogonal à logiciel interopérable...

C'est aller un peu fort ... Surtout en partant d'un 'get all the facts' d'un fournisseur même pas assez soucieux pour assurer l'interopérabilité des différentes générations de ses propres logiciels sur sa propre plate-forme.

12

Non je ne pense pas. C'est juste plus facile, c'est tout.