C++ 如何用c+编写可移植代码+;?

C++ 如何用c+编写可移植代码+;?,c++,portability,C++,Portability,在编写可移植代码时,我应该记住哪些事情?因为我是C++初学者,我想从开始练习它。 谢谢 尽可能使用STL类型。小心使用依赖于系统的类型和API。例如,不要在Windows上使用UINT和DWORD等类型 您可以使用类似boost的库来简化可移植代码的编写。如果你需要一个GUI,考虑使用一个跨平台的工具包,比如QT. 有时您需要编写特定于平台的代码,在这些情况下,您可以执行以下操作: #ifdef _WIN32 #include <windows.h> #else #include &

在编写可移植代码时,我应该记住哪些事情?因为我是C++初学者,我想从开始练习它。
谢谢

尽可能使用STL类型。小心使用依赖于系统的类型和API。例如,不要在Windows上使用UINT和DWORD等类型

您可以使用类似boost的库来简化可移植代码的编写。如果你需要一个GUI,考虑使用一个跨平台的工具包,比如QT.

有时您需要编写特定于平台的代码,在这些情况下,您可以执行以下操作:

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
\ifdef\u WIN32
#包括
#否则
#包括
#恩迪夫
  • 学习使用标准库
  • 读书
  • 当你有经验时,学会使用

首先编写命令行程序。准备好后,可以找到跨平台窗口工具包,如


如果您对编写多语言代码感兴趣,请使用第三方unicode库,例如,而不是依赖于特定于平台的库。

为了学习,请尽量避免阅读专注于一种实现的书籍。在某些情况下,导言或早期章节将为您提供一些关于如何获取或使用语言实现的说明;如果它提到了不止一个实现,那么您可能还可以

获取一本独立于平台的参考书。Stroustrup的C++编程语言是一个很好的参考,虽然它不是一本初学者尝试学习的好书。不要依赖于给定实现的引用。例如,MSDN很有用,但它的主要焦点是如何使用VisualC++编写Windows程序,而不是如何编写将编译和运行到任何地方的程序。
要写任何真正有用的东西,你必须进入不可移植的代码。试着养成将用户界面代码与其他代码分离的习惯,因为这是兼容性最低的地方。在不同平台之间更改的代码越少,代码的可移植性就越强。

粗心大意的程序员可能会遇到很多陷阱,我们可以尝试对这些陷阱进行分类。但让我先告诉你:作为一个绝对的人,这是不可能的

问题是,由于特定的编译器问题,即使是符合标准的代码也可能无法移植

下面是我能想到的主要类别

编译器扩展

例如,变量数组的使用:

void func(int const n)
{
  int array[n];
}
这不是标准的,但许多编译器仍然支持它,因为它很实用

标准库扩展

许多标准库实现提供了从未指定的
std::hash_映射。如果您在代码中使用它,它是不可移植的

现代趋势是将这些内容隐藏到
std::tr1
名称空间中,以便程序员知道这是一个扩展

还要注意的是,许多定义了
typedef
或非泛型的宏(例如
PRETTY\u FUNCTION
)。标准中没有指定宏,并且很少指定typedef

特定于平台的

例如,标准中未规定
int
double
的大小和对齐方式。如果您进行位旋转,并期望它有32位,那么即使不更改编译器,您也将在64位平台上运行

平台API

我们的程序是用来编译的,它们通常是用来与运行它们的计算机进行交互的:

  • 用于访问硬件
  • 用于访问文件系统
  • 用于访问屏幕
您需要找到跨平台的可移植API,或者自行开发。检查以下列表中的一些库

大多数编写良好的库基本上都是可移植的,只需确保它们支持:

  • 您感兴趣的编译器
  • 您感兴趣的平台
好的图书馆包括:

  • Apache(库集合)
  • 促进
  • Qt(用于图形)
  • ICU(用于Unicode处理)
你需要回顾的其他内容。。。这需要时间

我认为没有一个完美的答案。但由于完美的可移植性是不可能的,您需要决定您希望支持哪种编译器和平台


对于平台,您应该从Windows和一个Linux版本开始。对于编译器,可以选择任意两个(如果您负担得起的话,可以使用Comeau)。

一个好主意是使用POSIX系统调用。这样,您就不必处理创建线程或使用互斥体和信号的不同方式


问题是Windows并不完全符合POSIX,但有些库实现了某些POSIX功能,例如:[1]:

将特定于平台的代码与可重用代码分开,最好在不同的文件中,但至少在不同的函数中。如果你开始到处都是
#如果WIN32
#如果CYGWIN
#如果BSD
,你会有一场维护噩梦


然后,尽早并经常在至少两个不同的平台上编译。典型的选择是Windows上的Visual C++和Linux上的GCC。因为系统库和编译器都不共享,所以在你的设计变得深深根深蒂固之前,你会捕获非移植代码。C++中,

OS无关代码是很难做到的。考虑这个平凡的例子:

#include <iostream>
int main(int argc, char** argv) {
  std::cout << argv[0] << std::endl;
}
#包括
int main(int argc,字符**argv){
标准::cout一些指南:

  • 将代码的业务端和GUI分开
  • 避免使用特定于编译器的拐杖(#pragma等)
  • 使用不会改变编译器/平台行为的常规表达式,而不是可爱的位操作技巧
  • 如果它接触到硬件,它就属于
    #include <iostream>
    int wmain(int argc, wchar_t** argv) {
      std::wcout << argv[0] << std::endl;
    }