1

次のように一連の関数を呼び出すプログラムがあります。

int _stdcall VB_Create(char*);
int _stdcall VB_Open(unsigned int, unsigned int, unsigned int, unsigned int);
...
...

名前の装飾に不一致がある場合、リンカは次のようなエラーを表示します。

error LNK2019: unresolved external symbol "int __stdcall VB_Create(char *)" (?VB_Create@@YGHPAD@Z) .....

私の理解では、_stdcall構文は'_' + 'name of the function' + '@' + 'number of arguments * 4'です。

では、なぜリンカーが?VB_Create@@YGHPAD@Z名前の装飾を求めているのでしょうか。これはどのような基準ですか?

4

2 に答える 2

2

これは、Visual C++ の名前マングリングです (MSDN にエンコーディングを説明する公式ページがあるかどうかは知りません。見つけられませんでした)。

C++ 関数は、バイナリで終わるシンボルにエンコードされた名前以上のものを必要とします: これらのシンボルは一意である必要がありますが、C++ 関数名は一意である必要はありません。他の理由の中で、C++ 関数はオーバーロードされる可能性があり、異なる名前空間に同じ名前の関数を持つことができ、メンバー関数を処理できる必要があります。

コンパイラは、関数を一意に識別できるように、このようなコンパクトなエンコード スキームを使用します。

于 2011-08-04T14:38:58.207 に答える
2

ジェームズはすでにそれを言った:それは名前マングリングの問題です。置く

#ifdef __cplusplus
extern "C" {
#endif

前と

#ifdef __cplusplus
}
#endif

関数宣言の後。これにより、C++ 名マングリングがオフになります。FWIW__stdcallはこれとは関係ありませんが、VB、IIRC には必要です。

于 2011-08-04T14:44:40.980 に答える