带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(3)

简介: 带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(3)

带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(2)https://developer.aliyun.com/article/1340928?groupCode=taobaotech


关于宽字符的问题

 

你需要知道的:在Windows中,wchar_t占两个字节,Linux中占四个字节,这里有几个问题

  1. 导致体积占用大小不同。
  2. 程序移植带来困难
  3. 隐式转换结果不符合预期

 

 

 

跨端开发应避免wchar的普遍使用,以避免宽窄字符转换带来的开销以及额外的问题,应普遍使用utf-8作为主要的编码,这也是主流的思路。即时是特殊场景也可以用使用utf16,避免使用wchar。简而言之,除非必要,否则请不要使用。

 

应该限定字符串数组在保存为字节流时,使用编码为uft-8

 

请在字符串前加u8"",特别是包含中文的部分,习惯在vs下开发的同学也需要额外注意,vs默认的文件编码是gb2312, 这会有概率导致字符串可能会不小心被保存为gbk编码格式。

 

同时u8仅限在字符串前使用,在字符前使用是没有任何意义的,即时在ms上会编译通过,在clang下会提示

1 int pos = targetID.rfind(u8'_'); // error: use of undeclared identifier 'u8' ...

 

 

避免连续两个尖括号的定义

 

例如

std::vector<std::vector<int>> vec

 

 

在Windows下这么写没问题,那么在某些平台下可能编译不过,提供两种方式:

  1. 可以在连续两个尖括号符号之间留一个空格,即
std::vector<std::vector<int> > vec;
  1. 也可以typedef

 

C++11标准里已经解决了此问题,如果确认编译器版本已经支持了这个特性(参考:https://isocpp.org/wiki/- faq/cpp11-language-misc

In C++98 this is a syntax error because there is no space between the two >s. C++11 recognizes such two >s as a correct termination of two template argument lists.),此条可以忽略,但是通常两个>>的情况也意味着嵌套使用,typedef后通常阅读性也会得到提高。

 

 

对于平台差异的代码部分处理

跨端开发难免出现平台差异性代码,对于这部分的处理,对于简短的部分建议使用if def的方式区别,对于功能性的、代码较多的建议使用分文件开发,xxxx_win.cpp, xxxx_mac.cpp, xxxx_linux.cpp, 可以参考chromium的代码在大量使用这种方式。

 

同时对于差异性代码部分,应保持除非必要否则不定义的原则,因尽可能保持跨端的代码处理方式,过多的平台差异性将势必导致维护性变的很差。

 

应避免使用非标准的编译器支持的关键词

 

  1. c++标准关键词参考 :

https://baike.baidu.com/item/C%2B%2B%E5%85%B3%E9%94%AE%E5%AD%97/5773813

  1. 双底杠开头的关键词多为Microsoft定义的c++关键词,跨端开发中应尽量避免,诸如:__super, __wchar_t,

__stdcall__stdcall等等,详细的请参考:https://docs.microsoft.com/zh-cn/cpp/cpp/keywords-cp- p?view=msvc-170#microsoft-specific-c-keywords

带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(4)https://developer.aliyun.com/article/1340926?groupCode=taobaotech

相关文章
|
JavaScript Unix 编译器
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(2)
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(2)
|
JSON 安全 编译器
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(4)
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(4)
|
Unix Java 编译器
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(5)
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(5)
|
Linux 程序员 C语言
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(1)
带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(1)
|
安全
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(5)
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(5)
|
数据采集 监控 安全
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(3)
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(3)
|
运维
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(6)
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(6)
|
移动开发 开发工具 容器
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(2)
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(2)
|
移动开发 安全 API
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(4)
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(4)
|
移动开发 缓存 前端开发
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(1)
带你读《2022技术人的百宝黑皮书》——打造淘宝极简包的轻量化框架(1)
125 0