Namen von Parametern in C-Funktionsprototypen einfügen?

Lesezeit: 4 Minuten

Beim Deklarieren von Funktionen in C sollten Sie einen Prototyp setzen, in dem Sie die Namen von Parametern nicht schreiben müssen. Nur mit seiner Art ist genug.

     void foo(int, char);

Meine Frage ist, ist es eine gute Praxis, auch Namen von Parametern einzuschließen?

  • Ich dachte, C benötigt Parameternamen (ich weiß jedoch nichts über C99). Vielleicht denken Sie an C++.

    – Marcelo Cantos

    17. November 2011 um 21:55 Uhr


  • @MarceloCantos: nein, C benötigt sie nicht; noch besser, der C-Standard erlaubt sogar noch, eine leere Parameterliste zu lassen, was bedeutet, dass keine Informationen über die Parameter gegeben werden (C99, §6.7.5.3, ¶14); im Gegensatz zu C++, wo es bedeutet, dass die Funktion keine Argumente akzeptiert.

    – Matteo Italien

    17. November 2011 um 22:11 Uhr

  • @WTP: das war ein ironisches „besser“ 🙂 Sogar der Standard sagt (§6.11.6 ¶1), dass „die Verwendung von Funktionsdeklaratoren mit leeren Klammern (keine Parametertyp-Deklaratoren im Prototypformat) eine veraltete Funktion ist.“, da es einen Teil des Zwecks von Prototypen zunichte macht.

    – Matteo Italien

    17. November 2011 um 22:16 Uhr


  • @MatteoItalia: Mir ist gerade aufgefallen, dass ich Deklarationen und Definitionen verwechsle. EIN Definition erfordert Parameternamen in C – und nicht in C++ – aber die obige Deklaration ist in beiden gültig.

    – Marcelo Cantos

    17. November 2011 um 22:17 Uhr


Benutzer-Avatar
Kerrek SB

Ja, es gilt als gute Praxis, die Argumente auch in den Prototypen zu benennen.

Normalerweise haben Sie alle Ihre Prototypen in der Header-Datei, und der Header ist möglicherweise das Einzige, was Ihre Benutzer jemals überprüfen können. Aussagekräftige Argumentnamen zu haben, ist also die erste Ebene der Dokumentation für Ihre API.

Ebenso sollten Kommentare darüber, was die Funktionen tun (natürlich nicht, wie sie implementiert sind), zusammen mit ihren Prototypen in den Header kommen.

Eine gut geschriebene Header-Datei kann der wichtigste Teil Ihrer Bibliothek sein!


Nebenbei bemerkt ist die Konstanz der Argumente ein Implementierungsdetail. Wenn Sie also eine Argumentvariable in Ihrer Implementierung nicht mutieren, nur lege das const in der Umsetzung:

/* Header file */

/* Computes a thingamajig with given base
 * in the given number of steps.
 * Returns half the thingamajig, or -1 on error.
 */
int super_compute(int base, int steps); 

/* implementation file */

#include "theheader.h"

int super_compute(const int base, int steps)
{
  int b = 2 * base;
  while (--steps) { b /= 8; } /* no need for a local variable :-) */
  return -1;
}

  • Warum sollten Sie dem Client, der nur die Header-Datei sieht, die Kenntnis von Constness verweigern?

    – David Heffernan

    17. November 2011 um 22:02 Uhr

  • @DavidHeffernan: Die Argumente werden als Wert übergeben, sodass der Benutzer mit diesen Informationen möglicherweise nichts anfangen kann.

    – Kerrek SB

    17. November 2011 um 22:02 Uhr

  • @Kerrek SB-Autovervollständigung bedeutet, dass Ihr Editor, wenn Sie einen Teil eines Funktions- oder Variablennamens eingeben, ihn automatisch auf das vollständige Symbol erweitern kann. Dies ähnelt der Autocomplete-Funktion von Google. Der Vorteil, hier Argumentnamen in Prototypen zu haben, besteht darin, dass der Editor Platzhalter einfügen kann, durch die Sie mit der Tabulatortaste navigieren können, und diese Platzhalter für den Programmierer von Bedeutung sind. Nur “int” oder “char *” zu haben, beschreibt nicht, worum es bei dem Argument geht. Dies ist besonders nützlich, wenn eine Funktion viele Argumente hat und Sie nicht jedes Mal in der Dokumentation nachschlagen möchten.

    Benutzer142019

    17. November 2011 um 22:06 Uhr


  • int (int, int) und int (const int, int) sind inkompatible Typen (C99 6.7.5.3 §15: Damit zwei Funktionstypen kompatibel sind […] entsprechende Parameter müssen kompatible Typen habenC99 6.7.3 §9: Damit zwei qualifizierte Typen kompatibel sind, müssen beide die identisch qualifizierte Version eines kompatiblen Typs haben), wodurch dieses undefinierte Verhalten entsteht; Portable Problemumgehung: Belassen Sie die Deklaration in den Header-Dateien unverändert und benennen Sie den Parameter in der Definition in um base_ und hinzufügen const int base = base_; zum Funktionskörper

    – Christoph

    17. November 2011 um 22:55 Uhr


  • [I we ultimately concluded that this was indeed perfectly OK, both in C and in C++.]

    – Kerrek SB

    18. November 2011 um 1:20 Uhr

Ich empfehle auf jeden Fall, die Namen der Parameter anzugeben. Wenn Sie eine Bibliothek schreiben, ist es für diejenigen, die Ihre Bibliothek verwenden werden, sicherlich nützlich, aus ihrem Prototyp in Ihren Header-Dateien entnehmen zu können, was eine Funktion tut. In Betracht ziehen memcpy zum Beispiel. Ohne die Namen der Parameter wissen Sie nicht mehr, welches die Quelle und welches das Ziel ist. Schließlich ist es einfacher, die Namen einzuschließen, als sie zu entfernen, wenn Sie Ihre Funktionsdefinition kopieren, um sie in einen Prototyp zu verwandeln. Wenn Sie die Namen beibehalten, müssen Sie am Ende nur noch ein Semikolon hinzufügen.

  • Gehört nicht zu den memcpy Argumente ein Zeiger auf Konstante und der andere ein Zeiger auf änderbar? Das verrät es irgendwie…

    – Kerrek SB

    17. November 2011 um 22:08 Uhr

  • @Kerrek, du hast Recht. Ich habe es vergessen const. Es zeigt, wie alt ich bin … Vielleicht atan2 ist ein besseres Beispiel.

    – lhf

    17. November 2011 um 23:05 Uhr


Einige IDEs und Editoren ziehen Prototypinformationen aus Header-Dateien und stellen die Parameterinformationen als Hinweise während der Eingabe bereit. Wenn die Namen verfügbar sind, hilft das, Code schneller zu schreiben (und kann dabei helfen, einige Fehler zu vermeiden).

1368310cookie-checkNamen von Parametern in C-Funktionsprototypen einfügen?

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

Privacy policy