Cから名前マングルされたシンボルを呼び出す方法は?
module.name:version
void* function(TypeSig); // Type of the function
自分の言語で記述されたコードパスを C で使用できるようにしたいと考えています。関数呼び出し規則はほぼ同じです。エクスポートするシンボル内のバージョンとモジュールパスを変更する必要があるだけで、C と同じ識別子規則を使用しているため、アンダースコアだけを使用することはできません。
Cから名前マングルされたシンボルを呼び出す方法は?
module.name:version
void* function(TypeSig); // Type of the function
自分の言語で記述されたコードパスを C で使用できるようにしたいと考えています。関数呼び出し規則はほぼ同じです。エクスポートするシンボル内のバージョンとモジュールパスを変更する必要があるだけで、C と同じ識別子規則を使用しているため、アンダースコアだけを使用することはできません。
IIUC さん、あなたは独自の言語を定義しており、適切な名前マングリング アルゴリズムを探しています。
Intel et.al を使用することをお勧めします。すべてのプラットフォームで g++ によって使用されるItanium 名マングリング アルゴリズム。特定のケースでは、C++ 宣言が
namespace module{ namespace name { namespace Vversion /*e.g. V1_0 */ {
void *function(int){}
}}}
これは次のようにマングルします
_ZN6module4name4V1_08functionEi
すべてのシンボルがそのアルゴリズムを使用しているため、互いに競合することはありません。また_ZN6module4name4V1_08functionEi
、_Z (または_UPPERCASE) で始まる名前はすべて (C の) 実装用に予約されているため、 と呼ばれる標準 C 関数と競合することはありません。g++ からの便利な呼び出し可能性が必要な場合は、この正確な規則を使用できます。それ以外の場合は、Z とは異なる文字を選択します。