678 Stimmen

Was ist eine "statische" Funktion in C?

Die Frage bezog sich auf einfache c Funktionen, nicht c++ static Methoden, wie in den Kommentaren präzisiert.

Ich verstehe, was ein static Variable ist, aber was ist eine static Funktion?

Und warum ist es so, dass, wenn ich eine Funktion deklariere, sagen wir void print_matrix in, sagen wir mal a.c (OHNE a.h ) und umfassen "a.c" - Ich bekomme "print_matrix@@....) already defined in a.obj" , ABER wenn ich es deklariere als static void print_matrix dann kompiliert er?

UPDATE Nur um das klarzustellen - ich weiß, dass auch .c ist schlecht, wie viele von Ihnen betont haben. Ich tue es nur, um vorübergehend Platz zu schaffen in main.c bis ich eine bessere Vorstellung davon habe, wie ich all diese Funktionen zu richtigen .h y .c Dateien. Nur eine vorübergehende, schnelle Lösung.

4voto

PoJyun Chiou Punkte 71

Da die statische Funktion nur in dieser Datei sichtbar ist. Eigentlich kann der Compiler einige Optimierung für Sie, wenn Sie "static" zu einer Funktion deklarieren.

Hier ein einfaches Beispiel.

main.c

#include <stdio.h>

static void test() 
{
    ghost(); // This is an unexist function.
}

int main()
{
    int ret = 0;

#ifdef TEST
#else
    test();
#endif
    return (ret);
} 

Und kompilieren Sie mit

gcc -o main main.c

Sie werden sehen, dass es fehlgeschlagen ist. Weil Sie nicht einmal die Funktion ghost() implementiert haben.

Was aber, wenn wir folgenden Befehl verwenden?

gcc -DTEST -O2 -o main main.c

Es Erfolg , und dieses Programm kann normal ausgeführt werden.

Warum? Es gibt 3 wichtige Punkte.

  1. -O2 : Compiler-Optimierungsstufe mindestens 2.
  2. -DTEST : Definieren Sie TEST, damit test() nicht aufgerufen wird.
  3. Definiert "static" zu test().

Nur wenn diese 3 Bedingungen alle erfüllt sind, können Sie die Kompilierung bestehen. Aufgrund dieser "statischen" Deklaration kann der Compiler bestätigen, dass test() NIE in einer anderen Datei aufgerufen werden wird. Ihr Compiler kann test() beim Kompilieren entfernen. Da wir test() nicht benötigen, spielt es keine Rolle, ob ghost() definiert oder implementiert ist.

1voto

Vihan Pamudya Punkte 19

Eine statische Funktion in C ist eine Funktion, deren Geltungsbereich auf die Objektdatei beschränkt ist. Das bedeutet, dass die statische Funktion nur in ihrer Objektdatei sichtbar ist. Eine Funktion kann als statische Funktion ausgedrückt werden, indem ein statisches Schlüsselwort vor den Namen der Funktion gesetzt wird.

Ein Beispiel, das dies verdeutlicht, lautet wie folgt

Es gibt zwei Dateien first.c y second.c . Der Inhalt dieser Dateien ist wie folgt angegeben

Inhalt von first.c ,

static void staticFunction(void)
{
   printf("Static function staticFunction() ");
}

Inhalt von second.c ,

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

Wenn der obige Code nun kompiliert wird, tritt ein Fehler auf, was bedeutet "undefined reference to staticFunction ()." Dies liegt daran, dass die Funktion staticFunction () eine statische Funktion ist, die nur in ihrer Objektdatei sichtbar ist.

Ein Programm, das statische Funktionen in C demonstriert, sieht folgendermaßen aus -

#include <stdio.h>

static void staticFunction(void){
   printf("Static function staticFunction() ");
}

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

Die Ausgabe des obigen Programms sieht wie folgt aus -

Static function staticFunc()

In dem obigen Programm wird die Funktion staticFunction() ist eine statische Funktion, die Folgendes ausgibt "Static function staticFunction()" . Die main() Funktion wird aufgerufen staticFunction() . Dieses Programm wird korrekt ausgeführt, da die statische Funktion nur von der Objektdatei aufgerufen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X