我正在研究一种COM风格的编译器交叉兼容插件框架,它依赖于兼容的虚拟表实现来实现ABI兼容性 . 我定义的接口只包含纯虚拟成员函数和重写的删除操作符,以便将破坏通道到实现位置 . 这适用于extern“C”工厂函数,它实例化接口的插件实现并返回接口类型指针 .
但是,我想知道智能指针是不是更现代的方式来管理插件对象的生命周期 . 我想我实际上设法创建了一个标准布局shared_ptr / weak_ptr,它使用一个引用计数对象定义并实现与插件接口相同的方式 . 它看起来像这样:
class IRefCount
{
public:
virtual void incRef() = 0;
virtual void decRef() = 0;
virtual bool incRefIfNZ() = 0;
virtual void incWRef() = 0;
virtual void decWRef() = 0;
virtual long uses() const = 0;
protected:
~ref_count_base() = default; //prohibit automatic storage
}
template <typename Ty>
class shared_ptr
{
private:
Ty* ptr_;
IRefCount* ref_count_;
public:
//member functions as defined by C++11 spec
}
三个问题:
在智能指针之前,工厂函数看起来像这样:
extern "C" IPlugin* factory() { try { return new Plugin(); } catch (...) { return nullptr; } }
现在,它看起来像这样:
extern "C" shared_ptr<IPlugin> factory() { try { return shared_ptr<IPlugin>(new Plugin()); } catch (...) { return nullptr; } }
VS2013给我警告C4190:'factory'指定了C-linkage,但返回与C不兼容的UDT'allive_ptr' . 根据MSDN,这是可以的,前提是调用者和被调用者都是C.
-
从“C”链接函数返回标准布局对象是否还有其他潜在问题?
-
调用约定 . 我应该为所有纯虚拟接口函数和工厂函数指定__stdcall吗?
-
我使用
<atomic>
作为参考计数 . 我正在编写与平台无关的代码,我还没有尝试过编译ARM . 根据http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/ch01s02s01.html armcc没有实现std :: atomic . 有更好的编译器/ stl吗?