3

私は長年 COM 関数をプログラミングしてきましたが、今日、多くの関数が C と C++ で実際に異なる署名を持っていることに気付きました。たとえば、CoCreateInstance 関数:

HRESULT CoCreateInstance(
  _In_   REFCLSID rclsid,
  _In_   LPUNKNOWN pUnkOuter,
  _In_   DWORD dwClsContext,
  _In_   REFIID riid,
  _Out_  LPVOID *ppv
);

C++ では、シグネチャは次のように展開されます。

unsigned __int32 CoCreateInstance(const CLSID& clsid, IUnknown*
pUnkOuter, unsigned __int32 dwClsContext, const IID& iid, void* ppv);

Cでは、署名は次のようになります

unsigned __int32 CoCreateInstance(const CLSID* clsid, IUnknown*
pUnkOuter, unsigned __int32 dwClsContext, const IID* iid, void* ppv);

Ole32.dll には CoCreateInstance のエントリが 1 つしかありません。つまり、2 つの宣言が同じ実装を指しています。

これは Microsoft 拡張機能ですか、それとも C++ 標準でサポートされていますか?

4

2 に答える 2

0

標準では、セクション 7.5 - リンケージ仕様を引用して、これを実装定義として指定しています。

  1. C++ から他の言語で定義されたオブジェクトへのリンク、および他の言語から C++ で定義されたオブジェクトへのリンクは、実装定義であり、言語に依存します。2 つの言語実装のオブジェクト レイアウト戦略が十分に類似している場合にのみ、このようなリンクを実現できます。
于 2015-10-29T02:23:36.690 に答える
0

まず最初に、C は C++ と非常によく似ていますが、別の言語であることを理解してください。CoCreateinstance() 関数に移ります。私が見る唯一の違いは、シグネチャが C++ では xxx& または参照渡しを使用し、C では xxx* を使用していることです。

理論的には、これは正しいです。渡されたパラメーターの値を変更できるようにするために、C はメモリ位置を渡すことを使用するため、呼び出し元の関数が必要な場合は、パラメーターの値を変更できます。C++ はメモリの場所を渡すことによってパラメーターを渡すこともできますが、同じ目的のためにより優れたメカニズムがあります。参照によって値を渡します。見た目は違っても機能は同じだと思います。

于 2013-09-21T07:51:12.557 に答える