Anonyme Funktionen, die GCC-Anweisungsausdrücke verwenden

Diese Frage ist nicht besonders spezifisch, es ist wirklich für meine eigene C-Anreicherung und ich hoffe, andere finden es nützlich.

Disclaimer: ich weiß, viele werden den Impuls haben, zu reagieren: "wenn Sie versuchen zu tun, FP dann verwenden Sie einfach eine funktionale Sprache". Ich arbeite in einer embedded-Umgebung, muss der link auf viele andere C-Bibliotheken, und nicht viel Raum für viele weitere große shared libs und keine Unterstützung für viele Sprachen-Laufzeiten. Darüber hinaus dynamische Speicherverwaltung in Frage. Ich bin auch nur wirklich neugierig.

Viele von uns haben gesehen, diese nette C-makro für lambda-Ausdrücke:

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

Und ein Beispiel für die Verwendung ist:

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

Mit gcc -std=c89 -E test.c lambda erweitert:

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

So, das sind meine Fragen:

  1. Was genau macht die Zeile int (*X); erklären? Natürlich int * X; ist ein Zeiger auf ein integer, aber wie diese zwei sich unterscheiden?
  2. Sich ein Blick auf die exapnded makro, was auf der Erde ist der Letzte __fn__ tun? Wenn ich einen test schreiben Funktion void test() { printf("hello"); } test; -, dass sofort ein Fehler ausgegeben. Ich verstehe nicht, dass syntax.
  3. Was bedeutet das für die Fehlersuche? (Ich bin Planung zu Experimentieren, mich mit diesem und gdb, aber andere Erfahrungen oder Meinungen wären toll). Würde diese Schraube statische Analysatoren?

InformationsquelleAutor der Frage B. VB. | 2012-05-01

Schreibe einen Kommentar