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?
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 static
der 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).
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
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