web-dev-qa-db-ja.com

静的VS extern "C" / "C ++"

静的メンバー関数と外部 "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, ...);
 _

編集:静的メンバーのバージョンが機能しないコンパイラまたはアーキテクチャを表示できます(そしてそれはコンパイラのバグではありません)。

22

extern "C" ++コンパイラのMANGLING(オーバーロードに必要なもの)を無効にします。

A.CPPでstaticになるように機能を宣言した場合、B.cpp(Cから残っているのは残り、匿名の名前空間の中に関数を入れる効果があります)。

4
eduffy

一般的に話す

ストレージクラス:

ストレージクラスは、変数または識別子の期間と範囲を示すために使用されます。

期間:

期間変数の寿命を示します。

スコープ:

スコープ変数の可視性を示します。

静的記憶域クラス:

静的記憶域クラスは、ローカル変数である識別子を関数またはファイルに宣言し、それが存在し、それが宣言された場所からの制御パスを存在し、その値を保持します。このストレージクラスには永続的な期間があります。このクラスの宣言された変数は、関数の1つの呼び出しから次の呼び出しまでの値を保持します。範囲はローカルです。変数は、ファイル内でグローバルに宣言されている場合にのみ、そのファイル内の関数によってのみ知られているか、または見られた関数によってのみ知られています。このストレージクラスは、変数の宣言も変数をゼロまたはすべてのビットOFFに初期化することを保証します。

extern storageクラス:

Extern Storageクラスは、ファイル内の関数に認識されるグローバル変数を宣言し、プログラム内のすべての関数に知られていることができるグローバル変数を宣言します。このストレージクラスには永続的な期間があります。このクラスの変数は、別の割り当てによって変更されるまでその値を保持します。範囲はグローバルです。変数は、プログラム内のすべての機能によって既知または見られます。

2
Durai Amuthan.H