在开发中,如何将代码做到跨平台,如何保持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. 一文回顾深度学习十年发展
  2. JavaScript随机生成颜色以及十六进制颜色 与RGB颜色值的相互转换
  3. Linux Shell高级技巧(一)
  4. C#结构体中数组的分配
  5. 7-49 打印学生选课清单 (25 分)(思路+详解+map做法(一对多)+超时解决)Come baby!
  6. 前端学习(2966):登录页面的制作
  7. php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题
  8. python网页内容获取记录pkg
  9. mysql 8.0以上 新版本账号密码策略修改和密码修改
  10. 关于web页面打开空白的情况
  11. [NOIp2017 TG Day2 T2] 宝藏
  12. vue前端页面数据加载添加loading效果
  13. 迅雷X 10.0.2.60 去广告版绿色精简版
  14. charles(青花瓷)抓包乱码【青花瓷抓包https内容】
  15. 2022年合肥及合肥市各地稳岗补贴申请条件及补贴标准申请流程实施细则
  16. 中台建设利器-SPI插件机制
  17. 全面比较Aptos和Sui:Aptos已上线 来看看Sui
  18. 常见监控摄像头专业术语(码流、分辨率、帧率)详解
  19. echart之全国地图切换省级地图
  20. 最新哔哩哔哩视频弹幕播放器源码+带后台/亲测无错误

热门文章

  1. oracle having(),Oracle HAVING子句
  2. reids mysql 面试_月薪3k的后端面试点-Mysql和Redis
  3. golang 接口_「Golang系列」 深入理解Golang Empty Interface (空接口)
  4. 子程序调用与宏定义的异同_冒泡排序_汇编语言的子程序调用与宏定义实现
  5. 接口测试用例设计思路_基于python语言的接口自动化demo小实战
  6. python web生产环境_2020年了,python的web framework sanic 可以考虑生产环境部署了么?...
  7. 网络盘的计算机密码是什么情况,电脑e盘拒绝访问是什么原因?e盘加密方法
  8. 有如下MySQL表_有一个名为app的MySQL数据库表,其建表语句如下: CR
  9. mysql调用短信接口_短信平台接口调用方法参考
  10. statistic在c语言中的作用,模型评价除了C-statistic,还能用什么指标?