将 msvc 代码移植到 Android/ios

Porting msvc code to Android/ios

我有一个用 C++ 为 Windows 编写的相当大的项目,其中包含一些 MSVC 特有的花哨的东西,例如 __declspec(property)、SEH 的使用、额外的模板和宏灵活性、内在函数等。

简而言之,它由各种应用程序和一个共享库 (lib) 组成,这是一个相当大的 "algorithmic" 代码。它完全用纯 C++ 编写(如我所说,它是 MSVC 的版本),不依赖于任何第 3 方,所有代码都是 "hand-made",没有 stdlib、STL、Boost 等

现在这段代码需要移植到移动平台,即Android和iOS。

代码应该与平台无关。除了堆内存分配等非常基本的东西外,没有明确依赖 OS。它确实取决于一些 Windows 特定的东西:SEH、TLS,但如果它们无法被替换,我可以牺牲这些东西。

而且我正在考虑如何处理它。从特定于 MSVC 的内容中清除整个代码是可能的,但并不方便。我宁愿保留它们,而且绝对不想为不同平台保留多个代码库。

那么,我有哪些选择? 据我了解,Android(NDK 的一部分)有 C++ 编译器,但它们可能符合标准 C++。无论如何,iOS 开发是基于 Objective-C,它是普通 C 的超集。

这让我想到了将现有的特定于 MSVC 的 C++ 代码 "compile" 转换为普通 C 的想法。MSVC 编译器中有一个选项可以生成 "listing" 包含汇编代码的文件。我想是否有一个选项可以创建包含 C 代码的适当列表。或者,兼容 MSVC 的第 3 方 C++ -> C 转换器。

有什么想法吗?

MSVC++ 到 C 编译器属于 "if you have to ask, you can't afford it" 类别。市场太小了。

更现实的机会是等待微软正在做的事情。他们正在认真考虑使用 MSVC 2015 瞄准其他移动平台。

TLS 可能是最简单的,因为它是标准 C++ (thread_local)。 SEH 应该映射到常规的 C++ 异常处理,这意味着您需要在指针错误发生之前捕获它们。 MSVC 并不完全以 额外的 模板灵活性而闻名,它实际上相当不灵活。 x86 内在函数显然就在 ARM 上。

So, what are the options at my disposal?

编写可移植的 C 或 C++ 代码。

我有 运行 在 Android、iOS、Windows Phone、Windows、BSD 上的 C 和 C++ 库, OS X 和 Linux。该库一次编写,运行无处不在。

虽然 "core library" 是便携式的 C/C++,但下一层不是。这就是库与平台集成的地方。例如,iOS 测试套件驱动程序在 Apple 平台上有一个 Cocoa/CocoaTouch UI,在 Windows 和 Windows Mobile 上有一个 MFC 测试套件驱动程序。 Linux 上的测试套件驱动程序是命令行,因为我不会在 GTK 或 Qt 上浪费时间。

为随机数生成器提供种子的例程是特定于平台的。我认为它们是核心功能,因此它在核心库中并受平台特定 #defines.

保护

不要 犯在 运行 所在的每个平台上重新实现核心库的错误。这意味着您将需要 4 到 8 倍的开发周期来复制代码和行为。而且总会有一些小的、隐藏的行为错误,你会浪费无数时间去追踪。


And I'm thinking about how to deal with it. Cleaning the whole code from MSVC-specific stuff is possible, but not convenient.

是的,这样做。一次缴纳税款,享受代码余生福利。


This led me to an idea to "compile" the existing MSVC-specific C++ code into a plain C.

不,我不会这样做。从核心库中删除平台特定的东西。使核心库可移植。