#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)).

D'ailleurs les développeurs de g++ ont pris une position un peu plus saine à ce sujet
(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
)