2016-02-16 25 views
6

別のCファイルから静的関数を呼び出したい。しかし、それは常に"function" used but never definedと表示されます。 ble.h他のcファイルから静的関数を呼び出す方法は?

static void bt_le_start_notification(void); 

ble.cで

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

私はmain.cのbt_le_start_notificationを呼び出そうとすると、それは、"bt_le_start_notification" used but never definedが表示されます。

main.cので

#include "ble.h" 

void application_start(void) 
{ 
    bt_le_start_notification(); 
} 

私は何かが欠けていましたか?前もって感謝します。

+2

'静的な無効bt_le_start_notification(無効);' 'なぜstatic'あなたは別の' C file'からそれを呼び出すことを意味しますか? – dxiv

+1

できません。 –

+0

これは、「私は貴重品を銀行の金庫の中に閉じ込めました。今は私の貴重品を誰もが公に見ることができるようにしたいのですが、どうすれば世界中の人に私の銀行の金庫にアクセスできますか? "誰もがそれらにアクセスしてほしいと思ったら、なぜ最初にそれらをロックしたのですか? – Lundin

答えて

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

のアクセスは、彼らは私たちがそれらを静的にする必要があり、外の世界から機能へのアクセスを制限したいdeclared.Whenされている場合を除いて、ファイルに限定されています。他のファイルからのアクセス関数を必要とする場合は、グローバル関数、つまり非静的関数を使用してください。

1

静的機能スコープは、定義されているファイル(つまり変換単位)です。

0

静的であると宣言したため、このメッセージが表示されます。したがって、実装は.cファイル内でのみ表示されます。 .hと.cの両方から静的を削除してみてください。これにより、あなたの関数が見えるようになります。静的関数へ

2

静的関数は内部結合を持ち、同じファイルに記述された関数によってのみ呼び出すことができます。しかし、静的関数を別のファイルから呼び出す場合は、Cでトリックがあります。 1. ble.cに関数ポインタをグローバルに作成し、定義します。 main.cのはexternで

(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; 

} 

関数ポインタ

#include "ble.h" 
extern fn_ptr; 

void application_start(void) 
{ 
    fn_ptr(); 
} 

それが役に立つことを願っています。

+0

不要な複雑さ。関数が翻訳単位の内部にあることを意図していない場合、それは '静的'として定義されるべきではありません。 –

+0

@MichaelFoukarakisクライアント独自のコードをそのまま残して、そこにコードをそのまま使用すると、別のソースファイルで静的関数を使用する必要がある場所であるため、vivekトリックが動作する場所があります。 – VRU

1

キーワードstaticは、関数が定義されているソースファイルに関数をカプセル化するためによく使用されます。つまり、外部からstatic関数を呼び出すことを目的としたものではなく、他のcファイルです。 extern article[^]は、その話題はかなり良いと私は思っています。

引用:

静的関数は、多くのJavaやC++でのプライベートメソッドのようなものです。プライベートメソッドは、クラスによってのみ使用され、クラスの外部では使用できないメソッドです。 Cでは、静的関数を宣言できます。静的関数は、唯一のソース内で使用可能な機能は、それが中で宣言されているファイルである。

だから、あなたが staticとしての機能を定義していない外から関数を呼び出す必要がある場合は結論として。

6

私はFrodoとANBU.SANKARに同意します まだ静的関数をファイルの外に呼び出す場合は、以下のような例を使用できます。

1.C

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

2.C

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

このようなプログラムのデザインは、通常は意味がありません。 – Lundin

+3

もちろんあります。自動ユニットテストを書くときにカプセル化を中断する必要があることがあります。これは完全に合法です。 – user7610

関連する問題