Google C++编程风格指南(四):智能指针和其他C++特性
注意宏PRI*会被编译器扩展为独立字符串,因此如果使用非常量的格式化字符串,需要将宏的值而不是宏名插入格式中,在使用宏PRI*时同样可以在%后指定长度等信息。例如,printf("x = %30"PRIuS"\n", x)在32位Linux上将被扩展为printf("x = %30" "u" "\n", x),编译器会处理为printf("x = %30u\n", x)。 2) 记住sizeof(void *) != sizeof(int),如果需要一个指针大小的整数要使用intptr_t。 3) 需要对结构对齐加以留心,尤其是对于存储在磁盘上的结构体。在64位系统中,任何拥有int64_t/uint64_t成员的类/结构体将默认被处理为8字节对齐。如果32位和64位代码共用磁盘上的结构体,需要确保两种体系结构下的结构体的对齐一致。大多数编译器提供了调整结构体对齐的方案。gcc中可使用__attribute__((packed)),MSVC提供了#pragma pack()和__declspec(align())(译者注,解决方案的项目属性里也可以直接设置)。 4) 创建64位常量时使用LL或ULL作为后缀,如: int64_t my_value = 0x123456789LL; uint64_t my_mask = 3ULL << 48; 5) 如果你确实需要32位和64位系统具有不同代码,可以在代码变量前使用。(尽量不要这么做,使用时尽量使修改局部化)。 14.预处理宏(Preprocessor Macros) 使用宏时要谨慎,尽量以内联函数、枚举和常量代替之。 宏意味着你和编译器看到的代码是不同的,因此可能导致异常行为,尤其是当宏存在于全局作用域中。 值得庆幸的是,C++中,宏不像C中那么必要。宏内联效率关键代码(performance-critical code)可以内联函数替代;宏存储常量可以const变量替代;宏“缩写”长变量名可以引用替代;使用宏进行条件编译,这个……,最好不要这么做,会令测试更加痛苦(#define防止头文件重包含当然是个例外)。 宏可以做一些其他技术无法实现的事情,在一些代码库(尤其是底层库中)可以看到宏的某些特性(如字符串化(stringifying,译者注,使用#)、连接(concatenation,译者注,使用##)等等)。但在使用前,仔细考虑一下能不能不使用宏实现同样效果。 译者注:关于宏的高级应用,可以参考《C语言宏的高级应用》。 下面给出的用法模式可以避免一些使用宏的问题,供使用宏时参考: 1) 不要在.h文件中定义宏; 2) 使用前正确#define,使用后正确#undef; 3) 不要只是对已经存在的宏使用#undef,选择一个不会冲突的名称; 4) 不使用会导致不稳定的C++构造(unbalanced C++ constructs,译者注)的宏,至少文档说明其行为。 15.0和NULL(0 and NULL) 整数用0,实数用0.0,指针用NULL,字符(串)用''\0''。 整数用0,实数用0.0,这一点是毫无争议的。 对于指针(地址值),到底是用0还是NULL,Bjarne Stroustrup建议使用最原始的0,我们建议使用看上去像是指针的NULL,事实上一些C++编译器(如gcc 4.1.0)专门提供了NULL的定义,可以给出有用的警告,尤其是sizeof(NULL)和sizeof(0)不相等的情况。 字符(串)用''\0'',不仅类型正确而且可读性好。 16. sizeof(sizeof) 尽可能用sizeof(varname)代替sizeof(type)。 使用sizeof(varname)是因为当变量类型改变时代码自动同步,有些情况下sizeof(type)或许有意义,还是要尽量避免,如果变量类型改变的话不能同步。
17. Boost库(Boost) 只使用Boost中被认可的库。 定义:Boost库集是一个非常受欢迎的、同级评议的(peer-reviewed)、免费的、开源的C++库。 优点:Boost代码质量普遍较高、可移植性好,填补了C++标准库很多空白,如型别特性(type traits)、更完善的绑定(binde |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |