Warum Deklaration von 'extern' funktioniert nicht mit statischen Funktionen in C?
Angenommen, der code:
extern int foo(void);
static int foo(void)
{
return 0;
}
Versuchen zu kompilieren mit GCC
$ gcc -Wall -std=c99 1.c
1.c:3:12: error: static declaration of ‘foo’ follows non-static declaration
1.c:1:12: note: previous declaration of ‘foo’ was here
1.c:3:12: warning: ‘foo’ defined but not used [-Wunused-function]
So, wie kann ich erklären statische Funktion?
"Also, wie kann ich erklären, statische Funktion?"
static int foo(void);
InformationsquelleAutor | 2012-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
extern
zeigt externe Bindung währendstatic
zeigt interne Verlinkung. Offensichtlich kann Man nicht beide auf die gleiche Funktion.In einfachen Worten, wenn Sie verwenden
static
auf die Funktion, die Sie teilt dem compiler mit, bitte beschränken Sie diese Funktion nur zu diesem übersetzung Einheit und nicht zulassen, dass jemand Zugriff auf diese aus einer anderen übersetzungseinheit.während Funktionsdeklarationen sind
extern
standardmäßig, wenn Sie angeben, dassextern
explizit sagen Sie dem compiler, erlauben Sie Bitte alle aus anderen übersetzungseinheiten um Zugriff auf diese Funktion.Also, der compiler kann nicht beides tun.
Also eine Wahl treffen, ob Sie möchten, dass die Funktion nur in der übersetzungseinheit oder nicht.
Wenn die ehemaligen machen es
static
und vergessenextern
. Wenn letzteres, legen Sie einfach dasstatic
.Gut Zu Lesen:
Was ist die externe Vernetzung und interne Verlinkung?
Obwohl über Q ist für C++, die meisten von dem, was diskutiert wird, gilt C als gut.
InformationsquelleAutor Alok Save
Erklären Sie es mit
static
InformationsquelleAutor Olaf Dietsche
extern
bedeutet, dass die Funktion definiert ist, in einer anderen übersetzungseinheit (Datei).static
bedeutet, es wird nur in der übersetzungseinheit, in der Sie definiert ist. Die beiden schließen sich gegenseitig aus.InformationsquelleAutor William Pursell
Ist n ' T es, dass statische gelöst werden können, mit extern(al) Verbindung wie
Datei1.c
Datei2.c
InformationsquelleAutor Angelo John