Benötigt eine statische Funktion das Schlüsselwort static für den Prototyp in C?

Lesezeit: 3 Minuten

Mein C-Programmierbuch sagt, dass ich, wenn ich eine statische Funktion erstellen möchte, das Schlüsselwort static vor die Funktion setzen muss Definition. Es wird nichts explizit über den Prototyp erwähnt. Außerdem verwenden die Beispiele keine Prototypen und setzen einfach die statischen Funktionen an den Anfang der Datei (damit sie keine Prototypen benötigen, gehe ich davon aus).

Benötigt also eine statische Funktion das Schlüsselwort static für den Prototyp? Oder tue ich nur vor die Definition stellen?

  • Hast du versucht zu kompilieren void foo(); static void foo() { }?

    Benutzer529758

    27. März 2013 um 21:38 Uhr

  • Nicht vor einem Computer, auf dem ich jetzt kompilieren kann. Außerdem habe ich festgestellt, dass beim Programmieren, nur weil es in einem Beispiel funktioniert, es nicht bedeutet, dass es funktioniert alle Fälle.

    Benutzer2211907

    27. März 2013 um 21:38 Uhr


  • Warum es selbst tun, wenn Sie SO bitten können, es für Sie zu tun?

    – Randy Howard

    27. März 2013 um 21:40 Uhr

  • @w1res Dies gilt zwar für einige Fälle, dies ist jedoch keiner von ihnen. Ich wäre beeindruckt, wenn Sie einen Compiler finden könnten, mit dem Sie den statischen Modifikator aus der Deklaration weglassen können

    – 75-Zoll-Pianist

    27. März 2013 um 21:49 Uhr

  • Eine interessante Frage. Ich frage mich, warum es die Downvotes bekommen hat.

    – undur_gongor

    27. März 2013 um 22:01 Uhr

Benutzeravatar von undur_gongor
undur_gongor

Nein. Eine Funktionsdeklaration (Prototyp oder sogar die Definition) kann das Schlüsselwort weglassen static wenn es nach einer weiteren Deklaration der gleichen Funktion mit kommt static.

Wenn es einen gibt static Deklaration einer Funktion, muss ihre erste Deklaration sein static.

Es ist in ISO/IEC 9899:1999, 6.7.1 definiert:

Wenn die Deklaration einer Dateibereichskennung für […] eine Funktion enthält den Speicherklassenbezeichner staticder Bezeichner hat eine interne Verknüpfung.

[…]

Für einen mit dem Speicherklassenbezeichner deklarierten Bezeichner extern in einem Umfang, in dem eine vorherige Erklärung dieses Identifikators sichtbar ist, wenn die vorherige Erklärung eine interne oder externe Verknüpfung angibt, ist die Verknüpfung des Identifikators bei der späteren Erklärung die gleiche wie die Verknüpfung, die bei der vorherigen Erklärung angegeben wurde.

[…]

Wenn die Deklaration eines Bezeichners für eine Funktion keinen Speicherklassenbezeichner hat, wird ihre Verknüpfung genau so bestimmt, als ob sie mit dem Speicherklassenbezeichner deklariert wäre extern.

[…]

Wenn innerhalb einer Übersetzungseinheit derselbe Bezeichner sowohl bei interner als auch bei externer Verknüpfung erscheint, ist das Verhalten undefiniert.

So gilt z. B.:

static void foo(void);
void foo(void);
static void foo(void) { }

Dieses auch:

static void foo(void) { }
void foo(void);

static void bar(void);
void bar(void) {}

Aber dieser Code ist falsch:

void foo(void);
static void foo(void) { }

Normalerweise werden und sollten Sie die haben static auch in den Prototypen (weil sie meist zuerst kommen).

  • static void foo(void) unterscheidet sich von void foo(void), nein? zwei unterschiedliche Erklärungen?

    – 75-Zoll-Pianist

    27. März 2013 um 21:57 Uhr

  • Nein, es ist nur eine redundante Deklaration derselben Funktion.

    – undur_gongor

    27. März 2013 um 21:58 Uhr

  • +1: und zur Erinnerung: Eine Funktionsdefinition dient als Prototyp; ein Prototyp dient als Erklärung.

    – pmg

    27. März 2013 um 22:24 Uhr


  • Schlüsselmitnahme: “Normalerweise werden und sollten Sie die Statik auch in den Prototypen haben (weil sie normalerweise zuerst kommen).”

    – Gabriel Staples

    2. Juli 2021 um 5:05 Uhr

Benutzeravatar von 75inchpianist
75-Zoll-Pianist

Ja, ja, Sie müssen static vor die Deklaration setzen.

Geben Sie dies in ideone.com ein

int add();
int main(){
    printf("%d",add());
    return 0;
}

static int add(){
    return 1+1;
}

Sie erhalten dieses Ergebnis: http://ideone.com/VzZCiE

jetzt tippe das ein

static int add();
int main(){
    printf("%d",add());
    return 0;
}

static int add(){
    return 1+1;
}

Du bekommst das: http://ideone.com/sz8HVR

booom

  • wie ist es falsch? Wenn Sie static weglassen, schlägt es fehl. Auch wenn Sie denken, dass es mit einigen Compilern funktioniert, wird es nicht mit allen Compilern funktionieren. Wollen Sie wirklich compilerspezifischen Code fördern, wenn er vermieden werden kann?

    – 75-Zoll-Pianist

    27. März 2013 um 23:47 Uhr

  • Sie haben die Beispiele in meiner Antwort gesehen? Sie enthalten Prototypen ohne Statik, sind aber korrekt und werden von jedem C-Compiler kompiliert. Das möchte ich aber nicht fördern.

    – undur_gongor

    28. März 2013 um 6:31 Uhr

1413480cookie-checkBenötigt eine statische Funktion das Schlüsselwort static für den Prototyp in C?

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

Privacy policy