Funktion-Zeiger-Typen ohne Argumente?
Ich versuche zu erklären, einen Funktionszeiger zeigt auf eine Funktion zurückgibt, die den gleichen Typ. Ich ausgelassen die Argumente, die Typen in der Zeiger-Deklaration, um zu sehen, welche Fehler generiert. Aber das Programm wurde erfolgreich kompiliert und ausgeführt, ohne Frage.
Stimmt diese Erklärung? Sollten wir nicht die Argumente angeben, Typen?
#include <stdio.h>
#include <stdlib.h>
void add(int a, int b)
{
printf("a + b = %d", a + b);
}
void (*pointer)() = &add;
int main()
{
add(5, 5);
return 0;
}
Ausgabe:
a + b = 10
- Dies ist vollkommen legal K&R-C.
- Beispiel-code nicht sinnvoll als ein Beispiel.
- Warum ist das so?
- Zeiger nicht verwendet worden sind, in einer Zuordnung ausgenommen. Durch die nicht wissen, verwenden Sie nicht sogar mit einem ungültigen Zeiger-auch wenn es? Es wurde nicht der Grund, warum die korrekte Ausgabe ist die der mindestens erreicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leeren Klammern innerhalb einer Art name bedeutet unspezifizierte Argumente. Beachten Sie, dass dies ist eine veraltete Funktion.
void (*pointer)()
erklärt Funktion hingewiesen haben unspezifizierte Anzahl von Argumenten. Es ist nicht vergleichbar mitvoid (*pointer)(void)
. Also später, wenn Sie verwendet zwei Argumente, passt erfolgreich nach definition.Gibt es paar Dinge, die Sie wissen sollten, hier...
- Funktion-Erklärung:
Funktion Prototyp:
prototype
ist eine spezielle Art der Deklaration, die beschreibt die Anzahl und die Typen der Parameter der Funktion.non-prototype
Funktion Erklärung sagt nichts über seine parameter.Beispiel:
Diese
non-prototype
Funktion Erklärung bedeutet nicht, dassmyFunction
nimmt keine Argumente an. Es bedeutet, dassmyFunction
nehmen eine unbestimmte Anzahl von Argumenten. Der compiler schaltet einfach nur argument-Typ-überprüfung, die Anzahl der Argumente, die überprüfung und Konvertierung fürmyFunction
.So dass Sie tun können,
float
wirddouble
nach der promotion. Sie können nicht verwenden, nicht-Prototyp-Deklarationen, wenn Sie nicht voll gefördert argument-Typen.