C-Funktion ohne Parameterverhalten

Lesezeit: 3 Minuten

Benutzeravatar von John Retallack
John Retallack

Kann mir jemand erklären, warum der folgende Code ohne Warnung oder Fehler kompiliert wird?

Ich würde erwarten, dass der Compiler mich warnt, dass die Funktion no_args erwartet keine Argumente.

Aber der Code wird kompiliert und ausgeführt no_args rekursiv.

static void has_args(int a, int b, int c) { 
    printf("has_args\n");
}

static void no_args() {
    printf("no_args\n");
    no_args(1, 2, 3);
}

void main() {
  no_args();
}

  • @Chris Ja. Warum, warum, wenn Leute hier posten, machen sie ihren Beispielcode so verdammt schwer lesbar. Was ist falsch daran, völlig unterschiedliche Namen für Dinge zu verwenden, anstatt solche, die fast gleich sind??? Bitte Leute, verwendet keine Namen wie “test” und “test1”, verwendet Namen wie “A”, “B” und “C”.

    Benutzer2100815

    8. Mai 2011 um 19:29 Uhr


  • Abgesehen von den Antworten, die korrekt darauf hinweisen, dass ein leerer Parametersatz kein Prototyp in C ist, können Sie Warnungen für fehlende Prototypen in GCC mit aktivieren -Wstrict-prototypes und in MSVC mit /Wall /W4. Beachten Sie, dass -Wall aktiviert diese Warnung in GCC nicht (ich bin mir nicht sicher, warum).

    – Michael Burr

    8. Mai 2011 um 20:21 Uhr

  • Hoppla, ich habe eine Bearbeitung dieser Frage genehmigt, obwohl ich sie ablehnen wollte.

    – Leichtigkeitsrennen im Orbit

    9. Mai 2011 um 13:31 Uhr

  • @Tomalak Geret’kal: Die ursprüngliche Bearbeitung, die vom Autor vorgenommen wurde, bedeutete, dass die folgenden Antworten nicht mit dem obigen Quellcode übereinstimmten … Vielleicht Sie Ja wirklich wollte es akzeptieren, du hast es nur noch nicht gemerkt? 🙂

    – fürsvarir

    9. Mai 2011 um 13:52 Uhr

  • Na sicher void main() sollte sein int main(void).

    – Keith Thompson

    23. August 2019 um 18:22 Uhr

Benutzeravatar von Chris Lutz
Chris Lutz

In C++, void no_args() deklariert eine Funktion, die keine Parameter akzeptiert (und nichts zurückgibt).

In C, void no_args() deklariert eine Funktion, die eine nicht spezifizierte (aber nicht variable) Anzahl von Parametern akzeptiert (und nichts zurückgibt). Alle Ihre Aufrufe sind also (gemäß dem Prototyp) in C gültig.

Verwenden Sie in C void no_args(void) um eine Funktion zu deklarieren, die wirklich keine Parameter akzeptiert (und nichts zurückgibt).

  • Was meinst du mit nicht angegeben (aber nicht variabel), kann ich auf diese Parameter innerhalb der Funktion verweisen?

    – John Retallack

    8. Mai 2011 um 19:28 Uhr

  • @John – Wenn die Funktion ist definiert mit Parametern, ja. Du müsstest tun void test(); int main(void) { test(); } void test(int a, int b, int c) { puts("Yo"); test(a, b, c); } (oder setzen test in einer separaten Datei.)

    – Chris Lutz

    8. Mai 2011 um 19:32 Uhr

  • +1 für “nicht spezifiziert (aber nicht variabel)”; @John bedeutet, dass der Compiler die Anzahl (oder den Typ) der Argumente nicht überprüft, aber Sie müssen die Funktion trotzdem mit Argumenten aufrufen, die den Parametern in der Definition entsprechen. Beachten Sie, dass sich Definition und Deklaration nicht in derselben Datei befinden müssen. In dem vom OP bereitgestellten Beispiel test ist ohne Parameter definiert und wird, obwohl der Prototyp dies nicht erzwingt, aufgerufen test() mit 1 oder mehr Argumenten ruft undefiniertes Verhalten auf

    – pmg

    8. Mai 2011 um 19:36 Uhr

  • Wow, ich bin seit über einem Jahrzehnt C/C++-Programmierer und habe das nie gewusst! Vielen Dank.

    – Valdo

    8. Mai 2011 um 20:05 Uhr

  • Beachten Sie, dass gcc die Option hat -Wstrict-prototypes davor zu warnen. Diese Option ist nicht Teil von -Wall oder auch -Wextra. Ich habe einen Testlauf unter gepostet pastehtml.com/view/1ef7p3a.html ; auch mein Standard-gcc-Alias ​​:)

    – pmg

    8. Mai 2011 um 20:25 Uhr

Wenn Sie eine Funktion mit einer leeren Argumentliste deklarieren, rufen Sie die K&R-Semantik (vor dem Prototyp) auf, und es wird nichts über die Parameterliste angenommen; Dies ist so, dass Prä-ANSI-C-Code weiterhin kompiliert wird. Wenn Sie eine prototypische Funktion mit einer leeren Parameterliste wünschen, verwenden Sie (void) Anstatt von ().

1402330cookie-checkC-Funktion ohne Parameterverhalten

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

Privacy policy