0

Cから名前マングルされたシンボルを呼び出す方法は?

module.name:version

void* function(TypeSig); // Type of the function

自分の言語で記述されたコードパスを C で使用できるようにしたいと考えています。関数呼び出し規則はほぼ同じです。エクスポートするシンボル内のバージョンとモジュールパスを変更する必要があるだけで、C と同じ識別子規則を使用しているため、アンダースコアだけを使用することはできません。

4

1 に答える 1

2

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 とは異なる文字を選択します。

于 2008-12-15T13:38:18.977 に答える