微软 C++编程风格指南

编者按:本文翻译自微软的官方github库
https://github.com/Microsoft/AirSim/blob/master/docs/coding_guidelines.md

现代C ++编码指南

我们正在使用现代 C ++ 11。其中的智能指针,Lambdas和C ++ 11多线程原语将会是你的朋友。

Quick Note

“标准化”的好处是有很多可供选择标准: ISO, Sutter & Stroustrup, ROS, LINUX, Google, Microsoft, CERN, GCC, ARM, LLVM可能还有成千上万的代码标准。不幸的是,这些标准中的大多数甚至不能对类或常量的命名这样的基础内容达成一致。可能是因为这些标准需要支持已有代码库,所以经常带来许多遗留问题。本文的目的是创建与 ISO, Sutter & Stroustrup, ROS, LINUX保持一致的指南,同时解决尽可能多的冲突,缺点和不一致的问题。

命名约定

避免在命名上使用任何匈牙利表示法和在指针命名上使用_ptr

代码元素样式内容
Namespaceunder_scoredDifferentiate from class names
Class nameCamelCaseTo differentiate from STL types which ISO recommends (do not use “C” or “T” prefixes)
Function namecamelCaseLower case start is almost universal except for .Net world
Parameters/Localsunder_scoredVast majority of standards recommends this because _ is more readable to C++ crowd (although not much to Java/.Net crowd)
Member variablesunder_scored_with_The prefix _ is heavily discouraged as ISO has rules around reserving _identifiers, so we recommend suffix instead
Enums and its membersCamelCaseMost except very old standards agree with this one
Globalsg_under_scoredYou shouldn’t have these in first place!
ConstantsUPPER_CASEVery contentious and we just have to pick one here, unless if is a private constant in class or method, then use naming for Members or Locals
File namesMatch case of class name in fileLot of pro and cons either way but this removes inconsistency in auto generated code (important for ROS)

头文件

可以使用命名空间限定的#ifdef来防止多次inclusion:

#ifndef msr_airsim_MyHeader_hpp
#define msr_airsim_MyHeader_hpp

//--your code

#endif

我们不使用#pragma一次的原因是因为如果在多个位置存在相同的头文件(在ROS构建系统下可能会这样做),就不会支持它。

代码包围结构

内部函数或方法体将大括号放在同一行上。在命名空间,类和方法级别之外使用单独的行。这被称为K&R风格,其变体广泛用于C ++与其他语言中更受欢迎的其他风格。请注意,如果您有单个语句,则不需要花括号,但是复杂语句使用大括号能更容易保持正确。

int main(int argc, char* argv[])
{
     while (x == y) {
        f0();
        if (cont()) {
            f1();
        } else {
            f2();
            f3();
        }
        if (x > 100)
            break;
    }
}

Const和References

审查您声明为const和引用的候选者的所有非标量参数。如果您来自C#/ Java / Python等语言,那么您经常会犯的错误是按值传递参数而不是const T&;特别是您希望传递的大多数字符串,向量和地图const T&;(如果它们是只读的)或者T&(如果它们是可写的)。还要const尽可能地为方法添加后缀。

重写

覆盖虚拟方法时,请使用覆盖后缀。

指针

这真的是关于内存管理。模拟器有很多性能关键代码,因此我们尝试避免因大量调用new / delete而使内存管理器过载。我们还希望避免在堆栈上过多地复制内容,因此我们尽可能通过引用传递内容。但是当对象真的需要比调用堆栈更长寿时,你经常需要在堆上分配该对象,因此你有一个指针。现在,如果管理该对象的生命周期变得棘手,我们建议使用 C ++ 11智能指针。但智能指针确实有成本,所以不要盲目地随处使用它们。对于性能至关重要的私有代码,可以使用原始指针。当与仅接受指针类型的遗留系统(例如,套接字API)接口时,通常还需要原始指针。但我们尝试尽可能地包装这些遗留接口,并避免这种编程风格泄漏到更大的代码库中。

例如,检查你是否可以在任何地方使用const const float * const xP。避免使用前缀或后缀来指示变量名中的指针类型,即使用my_obj而不是myobj_ptr在可能更好地区分变量的情况下使用,例如,int mynum = 5; int* mynum_ptr = mynum;

是不是太短了?

是的,作者是故意的,因为没有人喜欢阅读200页编码指南。本文的目标是仅涵盖GCC中的严格编译模式和VC ++中的4级警告&错误未涵盖的最重要的事情。如果你想知道如何用C ++编写更好的代码,请参阅GotWEffective Modern C ++一书。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Google C 编程指南是一份由Google所提供的关于使用C编程语言的指南。这份指南旨在帮助开发者更好地利用C语言进行软件开发。 首先,Google C 编程指南详细介绍了C语言的基础知识和语法规则。它包括了变量、数据类型、控制语句、函数、指针等基本概念和功能的解释和示例代码。通过仔细阅读这些内容,开发者可以建立起对C语言的初步理解。 其次,指南提供了一些关于C编程的最佳实践和代码规范。这些规范包括如何命名变量和函数、如何编写可读性强的代码、如何避免常见的错误等等。遵循这些最佳实践可以提高代码的可维护性和可读性,降低开发过程中产生错误的可能性。 此外,Google C 编程指南还讨论了一些常见的C编程问题和解决方法。它提供了一些技巧和技术,帮助开发者应对内存管理、错误处理、多线程编程等挑战。这些经验分享可以帮助开发者更好地理解和解决在C编程中常见的问题。 最后,Google C 编程指南还包括了一些有关代码审查和性能优化的建议。它提供了一些代码审查的准则和指南,帮助开发者检查和改进他们的代码质量。此外,它还提供了一些性能优化的技巧和建议,帮助开发者更好地优化他们的C代码以提高程序的运行效率。 总而言之,Google C 编程指南是一份宝贵的资源,为使用C语言进行开发的开发者提供了全面的指导。通过学习和使用这份指南,开发者可以提高其在C编程领域的技能,写出更高质量和高效的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值