我有一个用C ++ for Windows编写的相当大的项目,有一些特定于MSVC的奇特东西,比如__declspec(property)
,SEH的使用,额外的模板和宏的灵活性,内在函数等等。
简而言之,它包含各种应用程序和共享库(lib),这是一个非常大的算法"码。它完全用简单的C ++编写(正如我所说,MSVC的版本),不依赖于任何第三方,所有代码都是"手工制作",没有stdlib ,STL,Boost等。
现在需要将此代码移植到移动平台,即Android和iOS。
代码应该与平台无关。除了非常基本的东西,比如堆内存分配,没有明确的依赖OS。它确实取决于一些特定于Windows的东西:SEH,TLS,但如果它们无法被替换,那些就是我可以牺牲的东西。
我正在考虑如何处理它。从MSVC特定的东西清理整个代码是可能的,但不方便。我更喜欢保留它们,我绝对不想为不同的平台保留几个代码库。
那么,我有哪些选择呢? 据我所知,有Android的C ++编译器(NDK的一部分),但它们可能是标准的C ++兼容。无论如何,iOS开发基于Objective-C,它是普通C的超集。
这让我想到了#34;编译"将现有的MSVC特定的C ++代码转换为普通的C.在MSVC编译器中有一个选项可以生成" listing"文件,包含汇编代码。我想如果可以选择创建包含C代码的相应列表。或者,符合MSVC标准的第三方C ++ - > C转换器。
有什么想法吗?
答案 0 :(得分:3)
那么,我有哪些选择?
编写可移植的C或C ++代码。
我有在Android,iOS,Windows Phone,Windows,BSD,OS X和Linux上运行的C和C ++库。该库只编写一次,随处可见。
虽然"核心库"是可移植的C / C ++,下一层不是。这是图书馆与平台整合的地方。例如,iOS测试套件驱动程序在Apple平台上有一个Cocoa / CocoaTouch UI,在Windows和Windows Mobile上有一个MFC测试套件驱动器。 Linux上的测试套件驱动程序是命令行,因为我不会在GTK或Qt上浪费时间。
种子随机数生成器的例程是特定于平台的。我认为它们是核心功能,因此它位于核心库中,并由特定于平台的#defines
保护。
Don&#t> 错误地在其运行的每个平台上重新实现您的核心库。这意味着您将需要4x到8x的开发周期来复制代码和行为。并且总会有一些小的,隐藏的行为错误,你会浪费无数小时追踪。
我正在考虑如何处理它。从MSVC特定的东西清理整个代码是可能的,但不方便。
是的,这样做。支付一次税,享受代码剩余生命的好处。
这让我想到了#34;编译"将现有的MSVC特定的C ++代码转换为普通的C。
不,我不会这样做。从核心库中删除特定于平台的内容。使核心库可移植。
答案 1 :(得分:2)
MSVC ++到C编译器进入“如果你不得不问,你买不起”的类别。只是一个小市场。
更现实的机会是等待微软正在做的事情。他们正在认真考虑使用MSVC 2015定位其他移动平台。
TLS可能是最简单的,因为它是标准的C ++(thread_local
)。 SEH应映射到常规C ++异常处理,这意味着您需要在指针错误发生之前捕获它们。 MSVC并不完全以额外模板灵活性而闻名,它实际上相当不灵活。 x86内在函数显然已经在ARM上了。