带你读《2022技术人的百宝黑皮书》——19条跨端cpp开发有效经验总结(2)https://developer.aliyun.com/article/1340928?groupCode=taobaotech
关于宽字符的问题
你需要知道的:在Windows中,wchar_t占两个字节,Linux中占四个字节,这里有几个问题
- 导致体积占用大小不同。
- 程序移植带来困难
- 隐式转换结果不符合预期
跨端开发应避免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下这么写没问题,那么在某些平台下可能编译不过,提供两种方式:
- 可以在连续两个尖括号符号之间留一个空格,即
std::vector<std::vector<int> > vec;
- 也可以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的代码在大量使用这种方式。
同时对于差异性代码部分,应保持除非必要否则不定义的原则,因尽可能保持跨端的代码处理方式,过多的平台差异性将势必导致维护性变的很差。
应避免使用非标准的编译器支持的关键词
- c++标准关键词参考 :
https://baike.baidu.com/item/C%2B%2B%E5%85%B3%E9%94%AE%E5%AD%97/5773813
- 双底杠开头的关键词多为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