2014-09-08 17 views
19

Kann mir jemand sagen, was der Zweck ist, statische Funktionen außerhalb der Klassen zu deklarieren? Was ist der Unterschied zwischen diesen 2? Gibt es irgendwelche Vorteile für die Verwendung von statischen in dieser Situation?Statische Funktionen außerhalb der Klassen

static void someRandomFunction(); 

int main() 
{ 
    someRandomFunction(); 
    return 0; 
} 

und

void someRandomFunction(); 

int main() 
{ 
    someRandomFunction(); 
    return 0; 
} 

Antwort

23

Im Namensraumbereich gibt static einen Namen interne Verknüpfung, was bedeutet, dass es nur innerhalb der Übersetzungseinheit zugänglich ist, die die Definition enthält. Ohne static hat es externe Verbindung und ist in jeder Übersetzungseinheit zugänglich.

Sie würden static (oder alternativ einen unbenannten Namespace) verwenden, wenn Sie eine Funktion schreiben, die nur für die Verwendung in diesem Gerät gedacht ist; Die interne Verknüpfung bedeutet, dass andere Einheiten verschiedene Funktionen mit demselben Namen definieren können, ohne Namenskonflikte zu verursachen.

Nicht-statische Funktionen (und globale Namen im Allgemeinen) sind besser in einem Header deklarieren, um sicherzustellen, dass jede Übersetzungseinheit, die sie bekommt die gleiche Erklärung verwendet.

5

Die static Schlüsselwort auf globale Variablen oder Funktionen begrenzt die Sichtbarkeit und die Verknüpfung Umfang der Funktion oder Variable auf den aktuellen translation unit.

Das bedeutet, dass es für eine Funktion nur aus der aktuellen Quelldatei und nicht aus anderen Quelldateien aufgerufen werden kann.

1

static weist den Compiler an, die Funktion nicht zur Symboltabelle für die Objektdatei hinzuzufügen. Dies bedeutet effektiv, dass die Verbindung die Funktion nicht finden kann, was bedeutet, dass Sie die Funktion nur direkt in der aktuellen Kompilierungseinheit verwenden können. Sie können jedoch statische Funktionen von einer anderen Übersetzungseinheit aufrufen, wenn dies über einen Funktionszeiger erfolgt.

1
static void someRandomFunction(); 

Dies muss innerhalb der gleichen Kompilierungseinheit (Quelldatei) und außerhalb dieser Kompilierungseinheit verwendet werden, die nicht zur Verwendung verfügbar ist. Während, wenn Sie

void someRandomFunction(); 

mit einer Definition acrosss Programm haben, kann die Funktion durch eine Übersetzungseinheit global über das

1

Statische Methoden und statische Funktionen sind völlig verschiedene Dinge Programm verwendet werden.

Statische Methoden sind Methoden einer Klasse statt einer Instanz (die Sie bereits wissen, wie es scheint).

Statische Funktionen hingegen sind Funktionen, die nur in dem Modul verfügbar sind, in dem sie definiert sind. Sie werden nicht exportiert und können nicht in eine Header-Datei eingefügt und in einer anderen c-Datei verwendet werden. Auf diese Weise können Sie verschiedene Funktionen schreiben, die denselben Namen haben, und auch der Compiler kann Ihren Code durch Inlining der Funktion genauer optimieren, da er weiß, dass keine andere Datei davon abhängig ist.

5

Eine static Funktion bleibt nur im Dateibereich sichtbar. Dies ist eine C-Funktion.
Der empfohlene Weg, um es in C++ unter Verwendung eines anonymen Namespace zu tun, wie in:

namespace // no name, i.e. anonymous 
{ 
    static void someRandomFunction(); 
} 

int main() 
{ 
    someRandomFunction(); // visible only within this file. 
    return 0; 
} 

Beachten Sie, dass die Funktion Körper auch irgendwo innerhalb der gleichen Datei seit dem Linker erklärt werden muss, nicht versuchen Sie es in anderen (externen) Übersetzungseinheiten zu finden.
Also static void someRandomFunction(); ist wirklich eine Forward-Deklaration für eine Funktion, die an anderer Stelle in der gleichen Datei definiert ist (d. H. In der gleichen Übersetzungseinheit).

Wenn die Funktion tatsächlich aufgerufen wird, erhalten Sie einen Verknüpfungsfehler, es sei denn, der Funktionskörper ist in derselben Datei definiert.

+0

Gibt es irgendwelche Probleme, wenn man im Beispiel einen nicht-anonymen Namespace verwendet (den 'statischen' behalten)? – Hydren

+1

Nein. Das 'static' behält die Funktion im Dateibereich nur bei interner Verknüpfung. Die Suche nach Namen in der Datei erfolgt weiterhin mit den üblichen Namespace-Regeln. Achten Sie jedoch in diesem Fall wie üblich auf ODR-Verletzungen. –