在开发中,如何将代码做到跨平台,如何保持C/C++代码能够在多个平台上编译,是一个值得研究的问题。

此外,不同平台对某些操作有自己独特的优化,例如FFT(快速傅里叶变化)在android和ios上都有自己的独特的优化方式,如何在特定平台做优化,同样值得研究

混乱的 #ifdef

如何编写跨平台的代码呢?哥们,你脑袋里蹦出的第一个想法应该是使用:#ifdef

因此,你写的跨平台代码类似这样:
头文件:

// a.h
void print_something();

源文件:

// a.cpp
#include "a.h"#ifdef _WIN32_
void print_something()
{printf("_WIN32_");
}
#ifdef _LINUX_
void print_something()
{printf("_LINUX_");
}
#ifdef _IOS_
void print_something()
{printf("_IOS_");
}
#ifdef _ANDROID_
void print_something()
{printf("_ANDROID_");
}
#endif

也许有成百上千处的代码充斥着这样一堆的#ifdef,说实话,自打我第一次看见这种实现方式时就觉得它不够优雅,它很混乱。

只编译特定平台的代码

更加优雅的方式就是:只编译特定平台的代码

利用cmake这样的工具,在CMakeLists.txt中,你知道你关心哪个平台,所以你可以只编译特定平台的.c/.cpp文件,构建项目并忽略其他平台的代码。当你阅读代码的时候,就不用再看到一段的#ifdef了,因为他们被分成了不同的文件,这些文件永远都不会在同一个版本中冲突

因此,我可以构建一个头文件a.h和四个不同的.cpp文件:a_win.cpp, a_linux.cpp, a_ios.cpp和a_android.cpp

然后在CMakeLists.txt中可以这么写:

if(WIN32)FILE(GLOB PLATFORM_SOURCES *_win.cpp)
elseif(LINUX)FILE(GLOB PLATFORM_SOURCES *_linux.cpp)
elseif(IOS)FILE(GLOB PLATFORM_SOURCES *_ios.cpp)
elseif(ANDROID)FILE(GLOB PLATFORM_SOURCES *_android.cpp)
endif()add_library(a_lib ${PLATFORM_SOURCES})

这么做阅读和调整代码都非常简单,因为与平台相关的代码都单独放在一个文件中,比起原来丑陋的代码清晰了很多

Q&A

Q:只有少量的跨平台代码也要用这种方式吗?
A:不,如果只有少量的#ifdef并且不破坏代码的整洁,完全是可以接受的。因为我们的目的就是保持跨平台代码的整洁。

参考

  • A Better Way to Write Platform-specific C++ Code

如何写出优雅的跨平台的C/C++代码相关推荐

  1. php代码如何写得好看,如何写出优雅的PHP代码

    如何写出优雅的PHP代码 导语:PHP是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.下面我们来看看如何写出优雅的PHP代码,希望对大 ...

  2. 如何写出优雅的 Golang 代码

    Go 语言是一门简单.易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问 ...

  3. 大聪明教你学Java | 如何写出优雅的接口

    前言 在日常开发中,我们总会写各种各样的接口,尤其是在移动互联网,分布式.微服务盛行的当下,绝大部分项目都采用的微服务框架和前后端分离方式来开发,后端工程师能写出优雅接口代码无疑是前端工程师的一个福音 ...

  4. 设计方法:怎么写出优雅的 Go 项目?

    前言 Go 语言简单易学,对于大部分开发者来说,编写可运行的代码并不是一件难事,但如果想真正成为 Go 编程高手,你需要花很多精力去研究 Go 的编程哲学. 在我的开发生涯中,我见过各种各样的代码问题 ...

  5. 写出优雅性能的JAVA程序必须遵守的35个原则

    本文给出35条写出优雅性能的JAVA程序的建议,欢迎收藏! 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如jav ...

  6. 如何写出优雅的 Go 语言代码

    如何写出优雅的 Go 语言代码 查看全文 http://www.taodudu.cc/news/show-3196428.html 相关文章: 写日志的那些事儿 写有价值的单元测试 腾讯私有云MySQ ...

  7. 程序员如何写出优雅的代码?

    作者 | 老峰 责编 | 郭芮 一直以来,关于"代码规范"的话题都备受关注,业界甚至有很多流传甚广的段子不断调侃之.既然代码规范能引起这么大的共鸣,那么今天我们谈谈一个程序员的自我 ...

  8. 谈代码整洁之道,如何写出优雅的代码

    最近为了制定团队的代码规范,拜读了鲍勃大叔的<代码整洁之道>,读完之后,在如何写出整洁优雅的高质量代码方面有很大的启发.我认为<代码整洁之道>是我们提高编程能力和自我修养必读之 ...

  9. 优雅写mysql_如何写出优雅的代码?

    我 18 年在 PyCon 做过一次类似的分享 ,目的是如何写出优雅的代码.希望能部分回答这个问题,也希望与大家多多讨论.<聊聊编程原则>​zhuanlan.zhihu.com 要成为合格 ...

最新文章

  1. vCloud Automation Center (vCAC) 6.0 (一)
  2. NTU课程笔记 :CV6422(4) sampling process
  3. 设计模式 - Composite
  4. Redis整合springboot实现集群模式
  5. 大数据,从青铜到王者
  6. Myeclipse10.7安装git插件并将Java项目上传到码云(github)
  7. Ranger架构剖析
  8. 无线策略服务器,无线网络中的分布式资源管理策略研究
  9. 安装i3_330mm长显卡,240水冷,我的第一款小钢炮,雷匠R-i3装机体验
  10. sklearn knn 算法
  11. 李宏毅机器学习——梯度下降
  12. WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
  13. 一、坐标系之WGS84坐标系与WGS84 Web Mercator
  14. iphone用计算机显示器,如何将iPhone屏幕投射到电脑上
  15. 开启微信公众号定位服务器,微信公众号定位学会这几步就够了!
  16. 互联网晚报 | 9月14日 星期三 | ​理想汽车总裁5天抛售理想100万股港股;微信坚决抵制无底线追星;Phone15要改名?...
  17. 生于80年代,穷于10年代,败于90后
  18. 2020牛客寒假算法基础集训营1 D hanayo和米饭
  19. 爬梯:Redis全解析(二)
  20. Jetson TX2 远程控制(Remote Control)

热门文章

  1. oracle having(),Oracle HAVING子句
  2. 2个表 遍历 组合_分享一个python脚本--数字随机组合有多少
  3. 使用rpm安装mysql_如何使用rpm安装MySQL
  4. 【NLP】毕设学习笔记(九)长短期神经网络LSTM
  5. android git 版本管理,Android版本管理(git 和 repo)
  6. linux系统恢复上一次,如何将您的Ubuntu Linux系统恢复到其上一个状态
  7. vue中集合取第一个_快速学习Vue框架(知识点集合)
  8. sails mysql_sails项目创建与常用基础操作总结
  9. js设置控件的隐藏与显示的两种方法
  10. Spark案例:Scala版统计单词个数