【发布时间】:2010-11-29 18:05:25
【问题描述】:
这是对我之前的一个问题的跟进,我已经为我的项目提出了一个可能的解决方案,如果我有这个权利,我需要一些建议或指导。
基本上我的项目是一个可以在 Linux 和 Windows 上使用和编译的库,Linux 部分不是什么大问题,它是 Windows。
我的库主要由类组成,因此 95% 的 C++ 代码。为了提供更好的支持并避免名称修改问题,我将使用接口和工厂方法来获取这些类的实例,而不是直接调用它。我还将在工厂函数上使用 extern "C" 来避免名称混淆。
以下是问题:
-
我将在工厂函数上使用导出/导入宏,但是我是否需要在我希望提供实例的所有类的头文件中添加导出/导入 (__declspec(dllexport/import)) 以包括基类接口?还是仅仅导出工厂函数就够了?
-
我也在考虑使用智能指针功能进行自动释放,好主意还是让用户处理?我打算使用 autoptr 模板,它是标准库的一部分,可在两个平台上使用,对吗?
-
谁能启发我应该使用哪种调用约定?我知道它是微软特有的,所以我希望它不会干扰 Linux,所以我应该把它留空,让它成为我认为是 _thiscall 或类似的东西的默认值。
-
我收到这段代码的错误,我不知道为什么,但这是由于 extern "C":
错误是:
错误:C 函数'std::ostream& operator
错误:C 函数 'std::ostream& operator
...这些错误消息在所有函数中重复
代码如下:
//WINLIB is my macro for the dllimport/export
extern "C"{
//operator overloading for stream operation
WINLIB std::ostream& operator<<(std::ostream &st, const SpeedInfo &si);
WINLIB std::ostream& operator<<(std::ostream &st, const MemInfo &mi);
WINLIB std::ostream& operator<<(std::ostream &st, const analyzed_result&);
WINLIB std::ostream& operator<<(std::ostream &st, const ustring_set&);
WINLIB std::ostream& operator<<(std::ostream &st, const speed_map&);
WINLIB std::ostream& operator<<(std::ostream &st, const mem_map&);
WINLIB SpeedInfo operator+(SpeedInfo &si, SpeedInfo &si2);
WINLIB SpeedInfo& operator+=(SpeedInfo &si, SpeedInfo &si2);
WINLIB SpeedInfo operator-(SpeedInfo &si, SpeedInfo &si2);
WINLIB SpeedInfo& operator-=(SpeedInfo &si, SpeedInfo &si2);
WINLIB MemInfo operator+(MemInfo &mi, MemInfo &mi2);
WINLIB MemInfo& operator+=(MemInfo &mi, MemInfo &mi2);
WINLIB MemInfo operator-(MemInfo &mi, MemInfo &mi2);
WINLIB MemInfo& operator-=(MemInfo &mi, MemInfo &mi2);
}
【问题讨论】: