一般来说,在C++中存储二进制数据的最佳方法是什么?据我所知,这些选项很大程度上归结为使用字符串或向量<char> s.(我将省略char*s和malloc()的可能性,因为我特指C++).
通常我只是使用一个字符串,但是我不确定是否存在我缺少的开销,或者STL在内部进行的转换可能会破坏二进制数据的完整性.有没有人对此有任何指针(har)?这样或那样的建议或偏好?
我正在将大型C++应用程序从Linux(gcc)移植到Windows(Visual C++ 2008),并且遇到插件的链接器问题.在Linux上这不是问题,因为.so支持运行时符号查找,但dll似乎不支持这一点.
一些背景信息:托管脚本环境的应用程序(主机)提供插件接口(通过脚本API调用在运行时加载的共享库),允许扩展主机和脚本API,而无需重新编译主机应用程序.在Linux上,这只是在插件源中包含宿主应用程序的标题,但在Windows上我收到了链接器错误.我不确定我需要链接到Visual C++来解析这些符号.
我们的一个依赖项(开源,LGPL)具有预处理器声明,用于将__declspec(dllexport)和__declspec(dllimport)插入其标头中.一些先前的研究表明我可能也必须这样做,但我想在修改一大堆核心标题之前确定.(我之前能够在MinGW上工作,但我们已经决定支持Visual Studio是这类商业项目的必要条件.)
我的问题,简而言之:如何在Visual C++中将运行时加载的dll与主机exe相关联?
编辑:为了通过示例澄清问题,我在宿主应用程序中有一个类Object,它表示可以由脚本访问的对象的基本类型.在我的插件中,我有许多类来扩展Object以执行其他功能,例如集成网络支持或新的可视元素.这意味着我的dll必须与主机exe中的符号链接,我不知道该怎么做.
这是一个关于C++语言各种怪癖的有趣问题.我有一对函数,它们应该用矩形的角填充一系列点.它有两个重载:一个需要a Point[5]
,另一个需要a Point[4]
.5点版本是指一个封闭的多边形,而4点版本是指你只想要4个角落的周期.
显然这里有一些重复的工作,所以我希望能够使用4点版本填充5点版本的前4个点,所以我不会复制该代码.(并不是说复制很多,但每当我复制和粘贴代码时,我都会有可怕的过敏反应,我想避免这种情况.)
问题是,C++似乎并不关心将a转换T[m]
为T[n]
where 的想法n < m
.static_cast
似乎认为这些类型由于某种原因是不相容的.reinterpret_cast
当然,处理它很好,但是作为一般规则,如果可能的话,最好避免它.
所以我的问题是:是否有一种类型安全的方法将一个大小的数组转换为一个较小的数组,其中数组类型是相同的?
[编辑]代码,是的.我应该提到参数实际上是对数组的引用,而不仅仅是指针,因此编译器知道类型的区别.
void RectToPointArray(const degRect& rect, degPoint(&points)[4])
{
points[0].lat = rect.nw.lat; points[0].lon = rect.nw.lon;
points[1].lat = rect.nw.lat; points[1].lon = rect.se.lon;
points[2].lat = rect.se.lat; points[2].lon = rect.se.lon;
points[3].lat = rect.se.lat; points[3].lon = rect.nw.lon;
}
void RectToPointArray(const degRect& rect, degPoint(&points)[5])
{
// I would like to use a more type-safe check here if possible:
RectToPointArray(rect, reinterpret_cast<degPoint(&)[4]> (points));
points[4].lat = rect.nw.lat; points[4].lon = …
Run Code Online (Sandbox Code Playgroud)