Les fonctions anonymes à l'aide de GCC déclaration des expressions

Cette question n'est pas très précis; c'est vraiment pour mon propre C d'enrichissement et j'espère que d'autres peuvent le trouver utile.

Avertissement: je sais que beaucoup vont avoir l'impulsion de répondre avec des "si vous essayez de faire les FP alors il suffit d'utiliser un langage fonctionnel". Je travaille dans un environnement intégré qui a besoin d'accéder à de nombreux autres bibliothèques C, et n'a pas beaucoup de place pour beaucoup plus de grands shared libs et ne prend pas en charge la langue de nombreux environnements d'exécution. En outre, l'allocation de mémoire dynamique est hors de question. Je suis aussi vraiment curieux.

Beaucoup d'entre nous ont vu cette chouette C macro pour les expressions lambda:

#define lambda(return_type, function_body) \
({ \
      return_type __fn__ function_body \
          __fn__; \
})

Et un exemple d'utilisation est:

int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); //Example

À l'aide de gcc -std=c89 -E test.c, le lambda s'étend à:

int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });

Donc, voici mes questions:

  1. Que signifie exactement la ligne int (*X); déclarer? Bien sûr, int * X; est un pointeur vers un entier, mais comment ces deux diffèrent-ils?

  2. De prendre un coup d'oeil à la exapnded macro, ce qui sur terre ne le final __fn__ faire? Si j'écris une fonction de test void test() { printf("hello"); } test; - qui jette tout de suite un message d'erreur. Je ne comprends pas cette syntaxe.

  3. Qu'est-ce que cela signifie pour le débogage? (J'ai l'intention de me expérimenter avec cela et gdb, mais d'autres expériences ou opinions serait génial). Serait-ce que vis analyseurs statiques?

  • Aussi, je ne vois pas int (*X); n'importe où.
  • Ce n'est pas là en tant que tel. Tout en essayant de comprendre la syntaxe, j'ai été un peu perplexe que int (*X); compile, mais pas vraiment sûr de ce qu'il a défini..
  • int (*X)(<arguments>); est un prototype pour un pointeur de fonction par le nom de X. En d'autres termes: X est un pointeur vers une fonction acceptant <arguments> et retour d'un int.
  • Alors, disons que nous avons juste int (*x) - c'est un pointeur vers une fonction... une liste variable d'arguments, pas d'arguments?
  • Et comment est-ce pas le C ANSI? Par convention? parce qu'il compile sous -std=c89
  • Pour faire gcc strict C89 (ou C99) compilateur, utilisez -std=c89 -pedantic.
  • Parce que le mécanisme ici (déclaration expressions) ne sont pas dans la norme(s).
  • Vous avez besoin de la ()s parce que sinon vous vous retrouvez en avant-déclarant X comme une fonction retournant un pointeur vers int.
  • Aussi, les fonctions imbriquées entrent en jeu, qui sont un GCC extension.
  • Alors, comment faisons-nous des fonctions anonymes en C ANSI?
  • nous n'avons pas. Simplement pas pris en charge.
  • int (*x) est équivalent à int *x, c'est à dire un pointeur (*) int. int *x() est une fonction retournant un pointeur sur int. Avis le problème ici: le paramètre-liste de demande de déclaration (()) a une plus grande priorité de l'opérateur que le pointeur (*). Pour remplacer cela, utilisez les parenthèses: int (*x)() est un pointeur (*) à une fonction (()) de prendre quelconque d'arguments, de retour de type int. cdecl.org

InformationsquelleAutor Bill VB | 2012-05-01