PCL点云之旅02-PCL代码编程规范

411 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

PCL编程规范

架构师为了确保在PCL中所有代码风格的一致性,使得其他开发者以及用户更容易理解源码。PCL开发者制定并且遵循了一套严格的代码规范。PCL的开发者都默认遵循。除非有充足的理由才可以不遵循这些规范。当然,这些规范也不是一成不变的,但是提出和更改规则的人需要考虑兼容性,那就是让新加的规范与现有的代码相适应。

PCL推荐的命名规范

文件命名

所有的文件名单词之间应该用下划线隔开,例如unordered_map.hpp

  • 头文件的扩展名为.h
  • 模板类实现文件的扩展名为.hpp
  • 源文件的扩展名为.cpp

目录命名

所有的目录以及其子目录命名时,如果由多个单词组成。其之间用下划线隔开,PCL中各个目录遵循以下规则。

  • 头文件都应该放在源码目录树的include/下
  • 模板类文件都应该放在目录树的include/impl下
  • 源文件都应该放在目录树的 src/下

include语句

当文件在同一个目录下时include指示语句用双引号,在其他情况下就用尖括号,例如:

#include<pcl/module_name/file_name.h>
#include<pcl/module_name/impl/file_name.hpp>
#include "file_name.cpp"

宏定义命名

宏定义命名中字母都采用大写格式,为头文件所定义的宏后面还需要加上下划线,并且名称从include目录下开始,例如pcl/filters/bilateral.h 对应PCL_FILTERS_BILATERAL_H_.#ifdef和#define定义放在BSD协议的后面,代码的前面。#endif定义一直放在文件的末尾,并且加上一句注释掉的宏对应的宏定义。比如:

#ifndef PCL_MODULE_NAME_IM?L_FILE_NAME_HPP_
#define PCL_MODULE_NAME_IM?L_FILE_NAME_HPP_
//君的代码
#endif // PCL_MODULE_NAME_IMPL_FILE_NAME_HPP_

命名空间的命名

命名空间多于一个单词的,单词之间应该用下划线链接

namespace pcl_io{
    ...
}

类&结构命名

类名(和其他自定义类型的名称)应该是CamelCased(驼峰命名规范),也就是连写单词组成命名,每个单词首字母大写。但是又例外:如果类名包含一个缩写,这个缩写应该全部大写,类名和结构名最好是名词组成的名字。例如:PFHEstimation代替了Estima-tePFH。下面是例子

class ExampleClass;
class PFHEstimation;

函数&成员函数命名

函数和类的成员函数的命名应该采用CamelCased,也就是连写单词组成命名。除了首个单词首字母小写。其他单词首字母大写。他们的参数名词单词之间用下划线隔开,函数和类的成员函数命名最好采用动词。应该确保这些名字能够清楚的表达函数和类成员的功能。例如:checkForErrors() 而不是errorCheck(), dumpDataToFile()而不是dataFile-dump(). 下面是正确的做法。

int applyExamle(int example_arg);

变量命名

变量命名时,单词之间应该用下划线隔开,比如:

int my_variable;
  • 迭代子变量命名:迭代子变量应该反应出他们迭代的对象
int my_variable;
  • 常量命名:常量的名字应该是全大写
const static int MY_CONSTANT=1000;
  • 成员变量命名:命名类的成员变量时,单词之间用下划线隔开并且以下划线结尾,比如:
int example_int_; // 对阅读PCL源码很有帮助,可明显区分成员变量与局部变量

return语句

return语句需要在圆括号的内部有返回值,即规定return语句必须有返回值。但是,return语句如果没有返回值也会编译。

int 
main(){
    return (0);
}

PCL推荐的缩进与格式

命名空间缩进格式

在头文件里,命名空间的内容应该缩进两个空格。比如:

namespace pcl {
    class Foo{
        ...
    }
}

在一个实现文件里面,对每一个类成员函数或者函数的命名必须添加命名空间限定,比如:

void pcl::Foo::bar(){
    ...
}

一个类模板的模板参数必须与类不在同行,比如:

template<typename T>
class Foo{
    ...
}

函数/类成员函数格式

每一个函数的返回类型声明必须与函数声明放在不同的行,比如:

void 
bar();

在函数实现的时候也是一样的,返回类型声明与函数声明要放在不同的行。比如:

void
bar(){
    ...
}

或者:

void
Foo::bar(){
    ...
}

或者:

template <typename T> void
Foo<T>::bar(){
    ...
}

花括号

花括号成对出现,另起一行进行定义,必须闭合才能组成合理的程序块,比如:

if(a<b)
{
    ...
}
else
{
    ...
}

下面情况的花括号就可以省略

if(a<b) x=2*a;

空格格式

再强调一次,在PCL中的每一个代码块的标准缩进是两个空格。这里用单个空格来隔开函数/类成员函数名字与参数列表。

int
exampleMethod(int example_arg)

如果在头文件内嵌套了命名空间名,需要缩进两个空格,比如:

namespace foo
{
namespace bar
    {
void
method(int my_var);
    }
}

设计结构

类和应用程序接口

对于PCL的大多数类而言,接口(所有公有成员)不包含变量,仅仅包含两种类型的方法。

  • 第一种方法是get/set类型,该类型允许修改被类使用的参数和输入数据。
  • 第二种方法是用于执行类的功能。并得到比如计算,滤波,分割等效果。

参数传递

get/set类型的方式遵循下面的规则。

  • 如果说有大量的数据需要传送(常见例子就是往PCL中输入数据),优先采用boost共享指针,而不是实际传送的数据。
  • 成对的get和set类型成员函数总是需要采用一致的数据类型
  • 对于get类型的成员函数而言。如果只有一个参数需要被传递则会通过返回值;如果是两个类型的参数需要传递,则通过引用传递的方式进行传递。
  • 对于运算,滤波,分割等类型的参数遵循以下的规则
    • 无论传递数据的大小,返回参数最好是非指针类型的参数
    • 总是通过引用方式来传递输出数据

【PCL点云之旅02-PCL代码编程规范】 到此结束,如果您觉得对您有帮助的话,可以点赞收藏一下哦。您的支持就是对我最大的鼓励,能让我得到更多的推送流量,帮助到更多的人,最后感谢您花费宝贵的时间认真的阅读这篇文章。如果说您有什么需要我改进的建议欢迎到评论区一起和我讨论❤❤❤