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 只有一个条目,这意味着这两个声明指向同一个实现。

这是 Microsoft 扩展还是受 C++ 标准支持?

4

2 回答 2

0

首先要明白,虽然非常相似,但 C 是与 C++ 不同的语言。现在来到 CoCreateinstance() 函数。我看到的唯一区别是签名在 C++ 中使用 xxx& 或通过引用传递,而在 C 中使用 xxx*。

理论上,这是正确的。为了能够改变传递的参数的值,C 使用传递内存位置,所以如果调用者函数想要,它可以改变参数的值。尽管 C++ 也可以通过传递其内存位置来传递参数,但它具有更好的机制来实现相同的目的。它通过引用传递值。所以对我来说,即使它们看起来不同,但功能是相同的。

于 2013-09-21T07:51:12.557 回答
0

该标准将其指定为实现定义,引用第 7.5 节 - 链接规范

  1. 从 C++ 到用其他语言定义的对象以及从其他语言到用 C++ 定义的对象的链接是实现定义和语言相关的。只有在两种语言实现的对象布局策略足够相似的情况下,才能实现这种联动。
于 2015-10-29T02:23:36.690 回答