携手创作,共同成长!这是我参与「掘金日新计划 · 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代码编程规范】 到此结束,如果您觉得对您有帮助的话,可以点赞收藏一下哦。您的支持就是对我最大的鼓励,能让我得到更多的推送流量,帮助到更多的人,最后感谢您花费宝贵的时间认真的阅读这篇文章。如果说您有什么需要我改进的建议欢迎到评论区一起和我讨论❤❤❤