静的メンバー関数と外部 "C"リンケージ関数の違いは何ですか?たとえば、C++で "MakeContext"を使用する場合は、関数へのポインタを渡す必要があります。 Googleは、「MakeContext」がCですが、静的Worksを使用していることがわかりました。私はただラッキーですか、それとも...
class X {
public:
static void proxy(int i) {}
}
makecontext(..., (void (*)(void)) X::proxy, ...);
_
v
extern "C" void proxy(int i) {}
makecontext(..., (void (*)(void)) proxy, ...);
_
編集:静的メンバーのバージョンが機能しないコンパイラまたはアーキテクチャを表示できます(そしてそれはコンパイラのバグではありません)。
extern "C"
++コンパイラのMANGLING(オーバーロードに必要なもの)を無効にします。
A.CPPでstatic
になるように機能を宣言した場合、B.cpp(Cから残っているのは残り、匿名の名前空間の中に関数を入れる効果があります)。
一般的に話す
ストレージクラス:
ストレージクラスは、変数または識別子の期間と範囲を示すために使用されます。
期間:
期間変数の寿命を示します。
スコープ:
スコープ変数の可視性を示します。
静的記憶域クラス:
静的記憶域クラスは、ローカル変数である識別子を関数またはファイルに宣言し、それが存在し、それが宣言された場所からの制御パスを存在し、その値を保持します。このストレージクラスには永続的な期間があります。このクラスの宣言された変数は、関数の1つの呼び出しから次の呼び出しまでの値を保持します。範囲はローカルです。変数は、ファイル内でグローバルに宣言されている場合にのみ、そのファイル内の関数によってのみ知られているか、または見られた関数によってのみ知られています。このストレージクラスは、変数の宣言も変数をゼロまたはすべてのビットOFFに初期化することを保証します。
extern storageクラス:
Extern Storageクラスは、ファイル内の関数に認識されるグローバル変数を宣言し、プログラム内のすべての関数に知られていることができるグローバル変数を宣言します。このストレージクラスには永続的な期間があります。このクラスの変数は、別の割り当てによって変更されるまでその値を保持します。範囲はグローバルです。変数は、プログラム内のすべての機能によって既知または見られます。