【无标题】

跨平台注意事项

  • 提要
  • Windows - linux
  • 32位 - 64位
  • 编译器的不同
  • 计算机语言和第三方库
  • 结语

提要

所谓的跨平台,关键要求一份操作代码可以在不同类型的操作系统下运行。具体说,需要区分Windows和linux,32位和64位,gnu和msvc等。有意进行跨平台开发时,常常需要注意上述问题。

Windows - linux

这个点不用赘述,我们说的跨平台往往默认指的就是这个。这两个平台下,有下面几个默认的不同,使用时候需要注意:

  1. 编译器。linux平台下,编译几乎都是gcc,g++。win下,其实也能使用这两个,安装mingw就可以部署相关环境。但是,当我们安装visual studio后,会自动的将编译环境换成msvc,其版本跟随vs的变化而变化,这一点需要在使用cmake的时候注意。
  2. 库。比如网络库,线程库。linux和windows都有自己原生的库,比如pthread系列,winsock2系列。这 是不通用的。如果有跨平台需求的,需要提前规划这方面。比如,线程库使用C++提供的thread系类,网络库使用boost提供的asio系,这些自带跨平台属性的。其他的三方组件也类似。
  3. 使用工具。cmake,git等自不必多说。需要注意编辑器。有些编辑器自带了编译器并且会自动部署,比如上面提到的vs。注意这点就行。

32位 - 64位

区别主要在于long类型、指针的长度不同。解决的方法主要是cmakelist+宏控制编译。当然如果有空,自己定义一套数据结构也不是不行。需要注意命名,比如uint8_t这种,标准库中已经有了,自己再定义一边,意义不大,还容易混淆。

编译器的不同

gcc和msvc自然是不同的。msvc不同版本也有不同。比如下面一段代码

int main()
{	
	#ifdef  __windows__
	cout << "this windows" << endl;;
	#elif __linux__
	ls
	cout << "this linux" << endl;;
	#endif// __windows

	return 0;
}

对于msvc 2013,这段代码无法编译通过(似乎这个版本的编译器在预处理阶段不是最先处理宏定义)。但是对于2022的vs,这个可以编译通过。

计算机语言和第三方库

部分第三方库,尤其是个人开发的第三方库,跨平台做的并不友好,需要开发者提前做个甄别。

结语

总的来说,跨平台的知识不是很难懂,但是很繁琐。如果出问题了,需要耐心的debug。C++下的跨平台开发往往会使代码变得丑陋。如果并没有明确跨平台的需求,又想保留这方面的开放性,那么我的意见是:

做好对象的抽象;做好函数的封装

最后即使需要跨平台,也不至于太难办。

你可能感兴趣的:(c++,windows,linux)