c++ - without - pow function c




Warum ist eine Funktion ohne Argumentbezeichner in C++ gültig? (4)

Bei einer Funktion in C ++ mit Argumenten, die nur Typen sind und keine Bezeichner haben,

 void foo1(int, int, int){cout << "called foo1";}

Ich kann es so nennen:

int main()
{
    foo1(10, 10, 10);
}

Warum ist das ein gültiges Konstrukt in C ++? Ist dies nur eine Eigenart von C ++ oder hat diese Art der Deklaration tatsächlich einen Zweck? Können wir tatsächlich auf die Argumente zugreifen, die irgendwie übergeben wurden? (Diese Art der Methodendeklaration funktioniert in Java nicht.)


Eine Erklärung wie

void foo1(int, int, int){cout << "called foo1";}

zeigt in der Deklaration deutlich, dass Sie mit Ihrer Funktion eine Anforderung erfüllen wollen - zB eine bestimmte Funktion in der Basisklasse oder Schnittstelle überschreiben, die dort zB als deklariert werden könnte

virtual void foo1(int something, int another, int andAnother) = 0;

ABER Sie beabsichtigen nicht, die Ihnen übergebenen Parameter zu verwenden.

Ein anderes Beispiel wäre, wenn Sie die Funktion zB einer anderen Funktion übergeben möchten, die einen Funktionszeiger auf eine void-Funktion mit drei int-Parametern erwartet.

void giveMeFoo( void (*fn)(int, int, int) ) { ... }

Darüber hinaus geben höhere Warnstufen eine Warnung aus, wenn Parameter deklariert sind, die im Funktionsrumpf nicht ausgewertet werden. Sie können dies vermeiden, indem Sie die Parameternamen weglassen.

Die Parameter ohne Namen sind dann zwar im Funktionskörper nicht mehr zugänglich - absichtlich. user4581301 hat schön beschrieben, warum.

Die Deklaration einer Standalone-Funktion ohne Parameternamen wie in Ihrem Beispiel ist aufgrund der oben beschriebenen Verwendungszwecke zulässig, in den meisten Fällen jedoch offensichtlich sinnlos. Ein sinnvolles Beispiel finden Sie im Kommentarbereich. Ein weiteres Beispiel für eine eigenständige Funktion ohne Parameternamen könnte sein, dass Sie eine Bibliothek schreiben und entweder die Abwärtskompatibilität beibehalten möchten (Ihre Bibliotheksfunktion benötigt den Parameter nicht mehr, aber Sie möchten die öffentliche Header-Deklaration nicht aufheben). oder Sie möchten einen Parameter für die zukünftige Verwendung reservieren.


Es ist legal und wenn Sie sich fragen, warum:

In der Regel ergeben sich unbenannte Argumente aus der Vereinfachung des Codes oder aus der Vorausplanung für Erweiterungen. In beiden Fällen wird durch Belassen des Arguments sichergestellt, dass Anrufer von der Änderung nicht betroffen sind, obwohl es nicht verwendet wird.

Auszug aus: Bjarne Stroustrup. "Die C ++ - Programmiersprache, vierte Ausgabe."


Die Idee ist, dass Sie möglicherweise die Funktionsdefinition ändern möchten, um den Platzhalter später zu verwenden, ohne den gesamten Code zu ändern, in dem die Funktion aufgerufen wird.

Argumente in einer Funktionsdeklaration können ohne Bezeichner deklariert werden. Wenn diese mit Standardargumenten verwendet werden, kann es ein bisschen lustig aussehen. Sie können am Ende mit:

void f(int x, int = 0, float = 1.1);

In C ++ benötigen Sie keine Bezeichner in der Funktionsdefinition:

void f(int x, int, float flt) { /* ... */ }

Im Funktionskörper kann auf x und flt verwiesen werden, nicht jedoch auf das mittlere Argument, da es keinen Namen hat. Funktionsaufrufe müssen dennoch einen Wert für den Platzhalter bereitstellen: f(1) oder f(1,2,3.0) . Mit dieser Syntax können Sie das Argument als Platzhalter einfügen, ohne es zu verwenden.


Ja Es ist legal in C ++.

C ++ 11 n3337 Standard 8.4.1 (p6) Funktionsdefinitionen:

Hinweis: Nicht verwendete Parameter müssen nicht benannt werden. Zum Beispiel,

void print(int a, int) {
    std::printf("a = %d\n", a);
}

C ++ 14 Standard:

[8.3.5.11] Optional kann ein Bezeichner als Parametername angegeben werden. Wenn es in einer Funktionsdefinition vorhanden ist, nennt es einen Parameter (manchmal als "formales Argument" bezeichnet). [Hinweis: Insbesondere sind Parameternamen auch in Funktionsdefinitionen optional und Namen, die für einen Parameter in verschiedenen Deklarationen verwendet werden, und die Definition einer Funktion muss nicht identisch sein.]





syntax