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.
Habe ich richtig angenommen, dass diese beiden Formen genau gleich sind?
Wenn ja, warum ist diese Diskrepanz erlaubt und welche Form sollte ich verwenden?
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
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%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.
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:
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"?
Tags und Links c c++ function declaration static