如何写出优雅的跨平台的C/C++代码
在开发中,如何将代码做到跨平台,如何保持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++代码相关推荐
- php代码如何写得好看,如何写出优雅的PHP代码
如何写出优雅的PHP代码 导语:PHP是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.下面我们来看看如何写出优雅的PHP代码,希望对大 ...
- 如何写出优雅的 Golang 代码
Go 语言是一门简单.易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问 ...
- 大聪明教你学Java | 如何写出优雅的接口
前言 在日常开发中,我们总会写各种各样的接口,尤其是在移动互联网,分布式.微服务盛行的当下,绝大部分项目都采用的微服务框架和前后端分离方式来开发,后端工程师能写出优雅接口代码无疑是前端工程师的一个福音 ...
- 设计方法:怎么写出优雅的 Go 项目?
前言 Go 语言简单易学,对于大部分开发者来说,编写可运行的代码并不是一件难事,但如果想真正成为 Go 编程高手,你需要花很多精力去研究 Go 的编程哲学. 在我的开发生涯中,我见过各种各样的代码问题 ...
- 写出优雅性能的JAVA程序必须遵守的35个原则
本文给出35条写出优雅性能的JAVA程序的建议,欢迎收藏! 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如jav ...
- 如何写出优雅的 Go 语言代码
如何写出优雅的 Go 语言代码 查看全文 http://www.taodudu.cc/news/show-3196428.html 相关文章: 写日志的那些事儿 写有价值的单元测试 腾讯私有云MySQ ...
- 程序员如何写出优雅的代码?
作者 | 老峰 责编 | 郭芮 一直以来,关于"代码规范"的话题都备受关注,业界甚至有很多流传甚广的段子不断调侃之.既然代码规范能引起这么大的共鸣,那么今天我们谈谈一个程序员的自我 ...
- 谈代码整洁之道,如何写出优雅的代码
最近为了制定团队的代码规范,拜读了鲍勃大叔的<代码整洁之道>,读完之后,在如何写出整洁优雅的高质量代码方面有很大的启发.我认为<代码整洁之道>是我们提高编程能力和自我修养必读之 ...
- 优雅写mysql_如何写出优雅的代码?
我 18 年在 PyCon 做过一次类似的分享 ,目的是如何写出优雅的代码.希望能部分回答这个问题,也希望与大家多多讨论.<聊聊编程原则>zhuanlan.zhihu.com 要成为合格 ...
最新文章
- vCloud Automation Center (vCAC) 6.0 (一)
- NTU课程笔记 :CV6422(4) sampling process
- 设计模式 - Composite
- Redis整合springboot实现集群模式
- 大数据,从青铜到王者
- Myeclipse10.7安装git插件并将Java项目上传到码云(github)
- Ranger架构剖析
- 无线策略服务器,无线网络中的分布式资源管理策略研究
- 安装i3_330mm长显卡,240水冷,我的第一款小钢炮,雷匠R-i3装机体验
- sklearn knn 算法
- 李宏毅机器学习——梯度下降
- WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
- 一、坐标系之WGS84坐标系与WGS84 Web Mercator
- iphone用计算机显示器,如何将iPhone屏幕投射到电脑上
- 开启微信公众号定位服务器,微信公众号定位学会这几步就够了!
- 互联网晚报 | 9月14日 星期三 | ​理想汽车总裁5天抛售理想100万股港股;微信坚决抵制无底线追星;Phone15要改名?...
- 生于80年代,穷于10年代,败于90后
- 2020牛客寒假算法基础集训营1 D hanayo和米饭
- 爬梯:Redis全解析(二)
- Jetson TX2 远程控制(Remote Control)
热门文章
- oracle having(),Oracle HAVING子句
- 2个表 遍历 组合_分享一个python脚本--数字随机组合有多少
- 使用rpm安装mysql_如何使用rpm安装MySQL
- 【NLP】毕设学习笔记(九)长短期神经网络LSTM
- android git 版本管理,Android版本管理(git 和 repo)
- linux系统恢复上一次,如何将您的Ubuntu Linux系统恢复到其上一个状态
- vue中集合取第一个_快速学习Vue框架(知识点集合)
- sails mysql_sails项目创建与常用基础操作总结
- js设置控件的隐藏与显示的两种方法
- Spark案例:Scala版统计单词个数