Wie lese ich diese komplexe Deklaration in C? [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Amit Singh Tomar

Mögliches Duplikat:

Was ist die Bedeutung dieses Stück Code? void (*signal(int sig, void (*func)(int)))(int);

Ich habe eine komplexe Deklaration, die aus der Header-Datei “signal.h” entnommen wurde, und unten ist die Deklaration.

  void (*signal(int sig, void (*func)(int)))(int);

Nun, wie parse ich es? Wie

signal ist eine Funktion, die zwei Argumente ‘sig’ vom Typ int und ‘func’ nimmt, was ein Zeiger auf eine Funktion ist, die int als Argument nimmt und den Typ void zurückgibt; es gibt einen Zeiger auf die Funktion zurück, nimmt int als Argument und gibt void zurück.

Ist es OK oder Signal ist ein Zeiger auf Funktion?

  • Aber hier wurde ich verwirrt joyofprogramming.com/Docs_ColumnArticles/36-JoP-Dec-09.pdf

    – Amit Singh Tomar

    29. Februar 2012 um 14:29 Uhr

  • typedef int foo(void): foo ist ein Zeiger auf eine Funktion, aber Sie können es abkürzen und sagen, dass es eine Funktion ist, weil Sie es tun können foo x; x();

    – Benoît

    29. Februar 2012 um 14:32 Uhr

  • @Benoit kannst du es bitte als Antwort hinzufügen?

    – Amit Singh Tomar

    29. Februar 2012 um 14:33 Uhr

  • Ich bin mir nicht sicher, auf welcher Grundlage meine Frage geschlossen wurde, was ich gefragt habe, unterscheidet sich von dem, was zuvor gestellt wurde.

    – Amit Singh Tomar

    1. März 2012 um 7:46 Uhr

Benutzer-Avatar
Johannes Bode

Beginnen Sie mit dem Bezeichner ganz links und arbeiten Sie sich nach außen vor, wobei Sie sich daran erinnern [] und () vorher binden *Also *a[] ist ein Array von Zeigern, (*a)[] ist ein Zeiger auf ein Array, *f() ist eine Funktion, die einen Zeiger zurückgibt, und (*f)() ist ein Zeiger auf eine Funktion:

       signal                                     -- signal
       signal(                          )         -- is a function
       signal(    sig,                  )         -- with a parameter named sig
       signal(int sig,                  )         --   of type int
       signal(int sig,        func      )         -- and a parameter named func
       signal(int sig,      (*func)     )         --   which is a pointer
       signal(int sig,      (*func)(   ))         --   to a function
       signal(int sig,      (*func)(int))         --     taking an int parameter
       signal(int sig, void (*func)(int))         --     and returning void
      *signal(int sig, void (*func)(int))         -- returning a pointer
     (*signal(int sig, void (*func)(int)))(   )   -- to a function
     (*signal(int sig, void (*func)(int)))(int)   --   taking an int parameter
void (*signal(int sig, void (*func)(int)))(int);  --   and returning void

signal ordnet eine Signal-Handler-Funktion zu func mit Signal sigund gibt den Zeiger auf die alte Signalhandlerfunktion zurück:

void new_interrupt_handler(int sig)
{
  ... // do something interesting with interrupt signal
}

int main(void)
{
  void (*old_interrupt_handler)(int);
  ...
  /**
   * Set up our new interrupt handler
   */
  old_interrupt_handler = signal(SIGINT, new_interrupt_handler);
  ...
  /**
   * Restore original interrupt handler
   */
  signal(SIGINT, old_interrupt_handler);
  ...
}

  • +1 Sehr schön, Schritt-für-Schritt-Erklärung.

    – watbywbarif

    29. Februar 2012 um 14:46 Uhr

  • Danke @John für deine Gedanken, aber einige Benutzer hier sind dagegen und sagen, Signal sei ein Zeiger auf die Funktion.

    – Amit Singh Tomar

    29. Februar 2012 um 14:51 Uhr

  • @Amit – In Aarons Fall die Schnur, die er gefüttert hat cdecl ist nicht das, was Sie in Ihrer Frage geschrieben haben.

    – Johannes Bode

    29. Februar 2012 um 15:00 Uhr


  • +1 Einer der Gründe, warum Sie typedef für Funktionszeiger verwenden: Es ist einfacher für das Gehirn. 🙂

    – Netcoder

    29. Februar 2012 um 16:33 Uhr

  • @netcoder: Es kann solche Deklarationen sicherlich leichter lesbar machen, aber ich mag es zu wissen, wie die Funktionssignatur aussieht, ohne nach der Typedef suchen zu müssen. sighandler func; sagt mir nicht wie verwenden funcwohingegen void (*func)(int); tut.

    – Johannes Bode

    29. Februar 2012 um 16:42 Uhr

Benutzer-Avatar
Aaron Digulla

Verwenden cdecl.orgdu erhältst

Signal als Funktion deklarieren (int, Zeiger auf Funktion (int), die void zurückgibt), Zeiger auf Funktion (int), die void zurückgibt, zurückgeben

für die Eingabe

void (*signal(int, void(*)(int)))(int)

Das heisst signal ist eine Funktion. Das Ergebnis des Anrufs signal ist ein Zeiger auf eine Funktion void f(int).

Erläuterung: Die signal() Aufruf installiert a Neu Signalhandler und gibt die zurück alt Signal-Handler (damit Sie es später wiederherstellen können, wenn Sie möchten).

  • Aber in meinem Kontext ist das anders, oder?

    – Amit Singh Tomar

    29. Februar 2012 um 14:36 ​​Uhr

  • @Aaron – Sie haben nicht dieselbe Deklaration wie das OP eingegeben.

    – Johannes Bode

    29. Februar 2012 um 14:56 Uhr

  • @JohnBode: Du hast recht. Fest.

    – Aaron Digulla

    29. Februar 2012 um 15:14 Uhr

  • +1 zum Verlinken cdecl.org

    – JC Salomon

    29. Februar 2012 um 21:48 Uhr


Benutzer-Avatar
Ade YU

void (*signal(int, void (*)(int)))(int);  

       signal(                  )         // signal is a function
              int, void (*)(int)          // the parameter types of the function:
                                          //    an int and a function pointer (take int, return void)
void (*                          )(int);  // the return type of the function:
                                          //    a function pointer (take int, return void)

// Bearbeiten unter Bezugnahme auf Johns Antwort.

  • Nun, wie signalisiert der Zeiger, dass er funktioniert?

    – Amit Singh Tomar

    29. Februar 2012 um 14:39 Uhr

  • Es sagt, dass das Signal ein Funktionsrückgabezeiger ist.

    – Amit Singh Tomar

    29. Februar 2012 um 14:42 Uhr

  • Es ist jetzt wirklich verwirrend, die meisten Antworten sagen, dass die Funktion den Zeiger zurückgibt, und Sie sagen etwas anderes.

    – Amit Singh Tomar

    29. Februar 2012 um 14:46 Uhr

  • Wie ich in meiner Antwort sagte, () bindet vorher *Also *f() ist eine Funktion, die einen Zeiger zurückgibt, nicht ein Zeiger auf eine Funktion. Die Form der Erklärung für signal beinhaltet *signal(...)Also signal ist definitiv eine Funktion, die einen Zeiger zurückgibt.

    – Johannes Bode

    29. Februar 2012 um 14:57 Uhr

  • Danke @JohnBode für deine nette Erklärung. Ich habe meine war-falsche Antwort bearbeitet.

    – Ade YU

    29. Februar 2012 um 15:02 Uhr

Nein das stimmt. signal nimmt 2 Argumente, ein int und einen Zeiger auf eine Funktion und gibt einen Zeiger auf eine Funktion zurück (mit der gleichen Signatur wie die func Streit.)

Es ähnelt dem (imo) besser lesbaren:

typedef void (*sig_func)(int);
sig_func signal(int sig, sig_func func);

1145130cookie-checkWie lese ich diese komplexe Deklaration in C? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy