Statisches Schlüsselwort in der Funktionsdeklaration kann in der Funktionsdefinition fehlen?

8

Ich möchte eine statische Funktion haben, die ich in meiner .c-Datei deklariere, bevor ich sie definiere:

%Vor%

Es sieht jedoch so aus, als ob ich das Schlüsselwort static aus der Funktionsdefinition herauslassen kann und keine Compiler-Warnungen erhalte ... z. B.

%Vor%

Habe ich richtig angenommen, dass diese beiden Formen genau gleich sind?
Wenn ja, warum ist diese Diskrepanz erlaubt und welche Form sollte ich verwenden?

    
Arrakis 10.03.2011, 14:43
quelle

5 Antworten

7

Ja 7.1.1 / 6

  

Ein Name, der in einem Namespace-Bereich ohne einen Speicherklassen-Spezifizierer deklariert wurde, hat eine externe Verknüpfung, es sei denn, er hat aufgrund einer früheren Deklaration eine interne Verknüpfung und wird nicht als const deklariert.

Siehe auch die Beispiele von 7.1.1 / 7

    
AProgrammer 10.03.2011, 14:55
quelle
3

7.1.1 / 7:

  

Die durch sukzessive implizierten Verknüpfungen   Erklärungen für ein bestimmtes Unternehmen   zustimmen. Das heißt, in einem bestimmten Umfang,   jede Deklaration erklärt dasselbe   Objektname oder die gleiche Überladung von   Ein Funktionsname muss dasselbe bedeuten   Verknüpfung.

7.1.1 / 6: (Danke Steve - das ist auch nötig, damit die Antwort klar ist)

  

Ein Name, der in einem Namensraumbereich deklariert ist   ohne einen Storage-Class-Specifier hat   externe Verknüpfung, es sei denn, es hat   interne Verknüpfung wegen eines vorherigen   Erklärung und vorausgesetzt, es ist nicht   erklärt const. Objekte deklariert const   und nicht explizit extern deklariert   interne Verknüpfung haben.

Ja, diese beiden sind gleich.

Dies ist jedoch ungültig:

%Vor%     
Erik 10.03.2011 14:53
quelle
1

static - in diesem Kontext - wirkt sich nur auf den Bereich aus, wenn Sie eine Funktion statisch deklarieren, hat sie Dateiumfang. So können Sie leicht überprüfen, ob es gleich ist, indem Sie versuchen, von einer anderen Quelle auf die Funktion zuzugreifen.

Auf diese Weise vermeiden wir die Diskussionen über die Compilersprache etc.

    
Anders K. 10.03.2011 14:47
quelle
0

Das statische Attribut ändert die Sichtbarkeit der Übersetzungseinheit. Dies ermöglicht es, den gleichen Namen in verschiedenen Dateien für verschiedene Zwecke zu verwenden. Sie sollten die statische nur einmal verwenden. Wenn Sie einen Prototyp haben, müssen Sie hier tun.

Wenn Sie nach C++ fragen, sollten Sie keinen statischen, sondern anonymen Namespace verwenden, um das Symbol privat für die Kompilierungseinheit zu machen:

%Vor%     
harper 10.03.2011 14:55
quelle
0

Als Nebenbemerkung bietet C ++ eine bessere Alternative zu static . Sie können hier auch unbenannten Namespace verwenden

Beispiel,

%Vor%

Siehe diese:

Überlegenheit von unbenanntem Namespace gegenüber statisch?
Warum ist ein unbenannter Namespace eine "bessere" Alternative zu "static"?

    
Nawaz 10.03.2011 14:55
quelle

Tags und Links