7

static と宣言された関数と変数には内部リンケージがあり、ファイル スコープがあり、他のファイルの関数からは見えません。

次のような関数を宣言するとします:-

  static int foo(int i);

file1.c という名前の 1 つのファイルで、使用ポインターを使用して、他のファイル file2.c からこの関数にアクセスできますか。

それができると書かれている本を読んでいますが、それがどのように可能かわかりません。

そして、これらは正確な行です:-

内部リンケージがあるため、foo はそれが定義されているファイルの外部から直接呼び出すことはできません。可能)。

4

5 に答える 5

2

関数は別のファイルで静的であるため、他のファイルで名前で呼び出すことはできませんが、関数へのポインターを使用して呼び出すことができます。

extern int (*pf)(int);

このポインターに割り当てる必要がありfoo、その後アクセスできます。

于 2013-09-06T11:52:17.703 に答える
1

それを行うためのさらに別の方法は、静的関数をコールバックにすることです。

//------------------------------
// file react.c
#include "event.h"

static void react_on_event_A(void)
{
    // do something if event_A occurs.
}

void react_init(void)
{
    event_setup(EVENT_A, react_on_event_A);
}

react_on_event_Aここでは、イベント ドライバーが呼び出すことができるコールバックとして関数を設定していますが、他のユーザーがその識別子によって関数を呼び出すことをブロックしています。あなたは本当に他の誰かにその機能をやめるように言っています.

イベント ドライバーは次のようになります。

//------------------------------
// file event.h
typedef enum {
    EVENT_A,
} event_t;

void event_setup(event_t event, void (*callback)(void));
void event_check_and_run(void);


//------------------------------
// file event.c
static void (*event_A_callback)(void);

void event_setup(event_t event, void (*callback)(void))
{
    if (event == EVENT_A) {
        event_A_callback = callback;
    }
}

// Scheduled periodically, or reacting on interrupt.
void event_check_and_run(void)
{
    if (occured(EVENT_A) && (event_A_callback != NULL)) {
        event_A_callback();
    }
}

そうすることの利点は、モジュールreactが他のどのモジュール (eventこの場合) が独自の静的関数にアクセスできるかを制御することです。

他の選択肢 (関数を作成するstaticかしないか、またはヘッダー ファイルにポインターを発行する) では、アクセス権を誰にも、または全員に付与します。

于 2013-09-06T13:29:07.573 に答える