2016-02-16 3 views
6

Ich möchte eine statische Funktion aus einer anderen C-Datei aufrufen. Aber es zeigt immer "function" used but never defined.Wie ruft man die statische Funktion aus einer anderen c-Datei auf?

In ble.c

static void bt_le_start_notification(void) 
{ 
    WPRINT_BT_APP_INFO(("bt_le_start_notification\n")); 
} 

In ble.h

static void bt_le_start_notification(void); 

Wenn ich versuche,bt_le_start_notification in main.c zu nennen, wird es "bt_le_start_notification" used but never defined zeigen.

In main.c

#include "ble.h" 

void application_start(void) 
{ 
    bt_le_start_notification(); 
} 

Habe ich etwas fehlt? Danke im Voraus.

+2

'static void bt_le_start_notification (void);' Warum 'static' wenn Sie meinen es von einem anderen' C file' anrufen? – dxiv

+1

Sie können nicht.Period. –

+0

Das ist so, als würde ich sagen "Ich habe meine Wertsachen in einem Banktresor eingeschlossen. Jetzt möchte ich, dass alle meine Wertsachen für jedermann zugänglich sind. Wie gebe ich jedem auf der Welt Zugang zu meinem Banktresor? Die Bank weigert sich, mich das tun zu lassen . " Warum haben Sie sie erst einmal gesperrt, wenn Sie möchten, dass alle darauf zugreifen? – Lundin

Antwort

13
For restricting function access from other file, the keyword static is used 

Zugriff auf statische Funktionen auf die Datei beschränkt sei denn, sie sind declared.When wir Zugriff auf die Funktionen von Außenwelt beschränken wollen, müssen wir sie statisch machen. Wenn Sie von einer anderen Datei auf Funktionen zugreifen wollen, dann gehen Sie für globale Funktionen, d. H. Nicht statische Funktionen.

1

Der statische Funktionsumfang ist eine Datei (d. H. Übersetzungseinheit), in der er definiert ist.

0

Sie erhalten diese Nachricht, weil Sie die Funktion als statisch deklariert haben. Die Implementierung ist also nur in Ihrer .c-Datei sichtbar. Versuchen Sie, die statische Datei sowohl von Ihrer .h als auch von .c zu entfernen, damit Ihre Funktion gesehen werden kann.

2

Statische Funktion hat interne Verknüpfung und kann nur von Funktionen aufgerufen werden, die in derselben Datei geschrieben sind. Wenn Sie jedoch statische Funktion aus einer anderen Datei aufrufen möchten, haben wir einen Trick in C. Brich die Schritte. 1. Erstellen Sie in ble.c einen Funktionszeiger global und definieren Sie ihn.

(void)(*fn_ptr)(); 
static void bt_le_start_notification(void) 
{ 
    WPRINT_BT_APP_INFO(("bt_le_start_notification\n")); 
    fn_ptr=bt_le_start_notification; 

} 

in main.c extern die Funktionszeiger

#include "ble.h" 
extern fn_ptr; 

void application_start(void) 
{ 
    fn_ptr(); 
} 

Hoffe, dass es nützlich sein wird.

+0

Unnötige Komplexität. Wenn eine Funktion nicht in einer Übersetzungseinheit enthalten sein soll, sollte sie nicht als "statisch" definiert werden. –

+0

@MichaelFoukarakis gibt es Situationen, in denen Clients proprietären Code beibehalten werden sollte und Verbesserung sollte bei der Verwendung von dort Code angezeigt werden, so dass Sie dort eine statische Funktion in einer anderen Quelldatei verwenden müssen, so dass ist, wo Vivek Trick funktioniert – VRU

1

Das Schlüsselwort static wird häufig verwendet, um die Funktion in der Quelldatei zu kapseln, in der sie definiert ist. Es ist also nicht von außen eine static Funktion aufzurufen, eine andere c-Datei. Ein extern article[^] erklärt das Thema ziemlich gut, denke ich.

Zitat:

Statische Funktionen viel sind wie private Methoden in Java oder C++. Eine private Methode ist eine Methode, die nur von einer Klasse verwendet wird und nicht außerhalb davon verwendet werden kann. In C können wir eine statische Funktion deklarieren. Eine statische Funktion ist eine Funktion, die nur innerhalb der Quelle in der Datei verwendet werden, wird erklärt.

Also als Fazit, wenn Sie die Funktion aus aufrufen müssen außerhalb Sie die Funktion als static nicht definieren.

6

Ich stimme Frodo und ANBU.SANKAR Wenn Sie eine statische Funktion außerhalb der Datei aufrufen möchten, können Sie Beispiele wie unten verwenden.

1.c

extern (*func)(); 
int main(){ 
(func)(); 
return 0;} 

2.c

static void call1(){ 
printf("a \n"); 
} 
(*func)() = &call1; 
+0

Ausgenommen, ein solcher Programmentwurf macht normalerweise keinen Sinn ... – Lundin

+3

Sicher tut es. Manchmal müssen Sie die Einkapselung unterbrechen, wenn Sie automatisierte Unittests schreiben. Das ist völlig legitim. – user7610

Verwandte Themen