C++语言编程规范-函数
01
.1 内联函数
内联函数(inline function)小于 10 行
说明:内联函数具有一般函数的特性,它与一般函数不同之处只在于函数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。内联函数只适合于只有 1~10 行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对 来说微不足道,也没有必要用内联函数实现,一般的编译器会放弃内联方式,而采用普通的方式调用函数。
如果内联函数包含复杂的控制结构,如循环、分支(switch)、try-catch 等语句,一般编译器将该函数视同普通函数。虚函数、递归函数不能被用来做内联函数。
02
使用内联函数代替函数宏
说明:C++中也支持宏的功能,但是宏有其自身固有的缺陷(例如无法对参数进行类型检查),因此,能使用内联函数的地方,一定不使用宏。
示例:
//较好的例子:
template <class TYPE_T> inline TYPE_T& max(TYPE_T& x, TYPE_T& y)
{
return (x>y)?x:y;
}
//不好的例子:
#define MAX(x,y)((x)>(y)?(x):(y))
例外:一些通用且成熟的应用,如:对 new,delete 的封装处理,可以保留对宏的使用。
03
内联函数的实现放在独立的文件
说明:确保接口清晰。如果使用者和维护者看见声明包含大量的内联实现,会干扰他们的思维,降低声明的可读性和可维护性。所以除了最简单的成员存取函数外,其他较为复杂内联函数的实现放到独立的头文件中,复杂的内联函数的定义,应放在后缀名为-inl.h 的头文件中,在声明头文件的最后 include。
示例:
#ifndef CPP_RULE_H
#define CPP_RULE_H
class CppRule
{
public:
inline inlineFunction();
};
#include “cpp_rule-inl.h”
#endif //CPP_RULE_H
//cpp_rule-inl.h
#ifndef CPP_RULE_INL_H
#define CPP_RULE_INL_H
inline CppRule::inlineFunction()
{
//内联函数实现
}
#endif //CPP_RULE_INL_H
04
2 函数参数
入参尽量用 const 引用取代指针
说明:引用比指针更安全,因为它一定非空,且一定不会再指向其他目标;引用不需要检查非法的 NULL 指针。
如果是基于老平台开发的产品,则优先顺从原有平台的处理方式。
选择 const 避免参数被修改,让代码阅读者清晰地知道该参数不被修改,可大大增强代码可读性。
05
建议 消除未使用函数参数
说明:检查未使用的函数参数,确认是否需要使用该函数参数,如果不需要直接删除参数名。当实现接口时,有一些参数没有被引用是相当常见的。编译器会发现未使用的参数,并产生一个警告,有些组件甚至会认为这是一个错误。为避免发生如此情况,将未使用的参数使用/* 参数名 */ 语法将 其注释掉。
示例:
//好的例子: 将localityHint参数名去掉,在注释中保留参数名以备参考和理解参数含义
pointer allocate(size_type numObjects, const void * /* localityHint */ = 0)
{
return static_cast<pointer>(mallocShared(numObjects * sizeof(T)));
}
06
尽量少用缺省参数
说明:使用参数的缺省值仅仅方便函数的使用,没有赋予函数新的功能,但降低函数的可理解。缺省参数使得拷贝粘贴以前函数调用的代码难以呈现所有参数,当缺省参数不适用于新代码时可能导致重大问题。
07
3 函数指针
尽量少用函数指针
说明:不少代码中还是用函数指针来实现一些功能扩展(如封装),但函数指针难以理解和 难以维护,建议使用 C++中派生与继承的基本用法,少用函数指针。