:はいあなたはポインタを介し静的メソッドにアクセスすることができます。
これを理解するには、コンパイラのフードの中で何が起こっているのかをもう少し理解するのが最善でしょう。
わかりやすくするために、コンパイルされたプログラムはマシンコードで記述されています。 "プログラムローダー"用にコンパイルされたプログラムには特別な情報がありますが、プログラム自体はプロセッサーによって実行される命令です。
Cで関数 "foo()"を呼び出すと、Cコンパイラはこれを "CALL"プロセッサの動作に変換します。コードでは、fooのアドレス(文字通りメモリアドレスまたは「オフセット」)によってCALL操作が行われます。メモリアドレスであるため、名前( "foo")は使用されません。また、リンカーは、これが動作するために "foo"について知る必要はありません。
C言語で関数 "bar()"を呼び出し、その関数が別のコンパイル単位(別のCファイル)にあると、コンパイラはプログラム内のどこにメモリ)を呼び出します。つまり、CALL操作後にどのアドレスを書き込むのかはわかりません。これが起こると、アドレス用のスペースを残すコードが書き込まれますが、リンカーのメモが残ります。ノートはリンカーに "ここにバーのアドレスを置く"と伝えます。リンカは、メモリアドレスを使用して書かれたプログラムを修正します。リンカーがこれを行えるようにするには。コンパイラは、すべての関数名とそれぞれのアドレスを含むテーブルをコードに書き込みます。
静的なことは何ですか?これは単に、リンカーに渡されるテーブルに関数の名前とアドレスを書き込まないようにコンパイラに指示します。この関数は関数としてコードにはまだ存在しますが、リンカーはどこにあるのかわかりません。同じコンパイル単位内のコードは、その関数がどこにあるかを知るでしょう。したがって、同じコンパイル単位内の関数は、関数のアドレスをコンパイル単位外のポインタとして渡すことができます。
file1.h
typedef void (* VoidFunctionPointer)();
extern VoidFunctionPointer somethingInteresting;
bar();
FILE1.C
#include "a.h"
VoidFunctionPointer somethingInteresting;
static void foo() {
// do something interesting;
}
void bar() {
// we know what foo is because we're in the same compilation unit
somethingInteresting = foo;
}
file2.c
#include "a.h"
int main(int argC, char ** argV) {
bar();
// we can call somethingInteresting as if it is a function no matter
// wether it's declared static in code or not
// this can be foo, just as long as we don't have to use the name "foo"
somethingInteresting();
}
:
関数ポインタを渡すために使用するCコードは次のようなものです
このコードファイル2実際にはfile1から静的関数を実行します。重要なのは、file2はその関数の名前を必要としないので、staticは関数ポインタより効果がないということです。私はPE形式のMicrosoftの説明を読んだお勧めすることができます
[ここ](.EXEや.DLL):私が使用可能であると思われ、それを行うための
http://msdn.microsoft.com/en-us/library/ms809762.aspx
他のコンパイル単位から関数にアクセスしたい場合は、なぜ最初に静的にしていますか? – Jon
@Jon:コールバックを静的なものとして宣言することができます(他の誰もその識別子で関数を呼び出すことはできません)。あなたはそれをコールバック関数にする必要があり、通常のものと同じように呼び出すことはできません。 – Gauthier
@Gauthier:その場合、アドレスを呼び出し先に渡すだけでは何もする必要はありません。 'takes_callback(foo)' - あなたはすでにそれを提案しているのです。 OPは、(それを見たと答えた人たちのように)グローバルにアクセス可能な関数ポインタを求めていますが、これはまったく意味がありません。もちろん、moar rep * *の文字通りの質問に人々が答えるのを妨げることはありません。... –
Jon